在获取信息时防止我的功能阻塞功能
Keep my function from blocking functionality while getting info
我有一个带有完成处理程序的函数,可以从 youtube API 下载视频。
在第一个 运行 上,效果很好。在随后的 运行 秒中,由于视频存储在设备中,并在更新视频数组之前显示,我希望用户能够与 table 进行交互,而它是更新(如果需要)。但是,在下载信息时,与 table 或应用程序的交互被阻止。
我猜这与Grand Central Dispatch有关,但我不知道如何使用它。
Networking().getPlaylists() { (result: String) -> () in
self.activityView.removeFromSuperview()
print("should reload data")
self.tableView.reloadData()
}
}
有人可以指点一下吗?
理想情况下,您的网络代码将在后台线程上执行:
func getPlaylists() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//Do network stuff
})
}
而且在调用完成之前,请确保在执行 UI 逻辑(如更新 tableview)之前先返回到主线程:
func getPlaylists() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//Do network stuff
dispatch_async(dispatch_get_main_queue()) {
completion(results)
}
})
}
实际上不是 Alamofire 阻塞了我的 UI(它实际上是一个异步函数),而是在我解析时是 SwiftyJSON。我通过 dispatching_async 解决了它,但在解析部分而不是函数的其余部分!
在此处查看更多信息:
谢谢!
我有一个带有完成处理程序的函数,可以从 youtube API 下载视频。
在第一个 运行 上,效果很好。在随后的 运行 秒中,由于视频存储在设备中,并在更新视频数组之前显示,我希望用户能够与 table 进行交互,而它是更新(如果需要)。但是,在下载信息时,与 table 或应用程序的交互被阻止。
我猜这与Grand Central Dispatch有关,但我不知道如何使用它。
Networking().getPlaylists() { (result: String) -> () in
self.activityView.removeFromSuperview()
print("should reload data")
self.tableView.reloadData()
}
}
有人可以指点一下吗?
理想情况下,您的网络代码将在后台线程上执行:
func getPlaylists() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//Do network stuff
})
}
而且在调用完成之前,请确保在执行 UI 逻辑(如更新 tableview)之前先返回到主线程:
func getPlaylists() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
//Do network stuff
dispatch_async(dispatch_get_main_queue()) {
completion(results)
}
})
}
实际上不是 Alamofire 阻塞了我的 UI(它实际上是一个异步函数),而是在我解析时是 SwiftyJSON。我通过 dispatching_async 解决了它,但在解析部分而不是函数的其余部分!
在此处查看更多信息:
谢谢!