我已经实现了以下完成 block ,完成一个 block ,然后我相应地更新 UI 和对象。
func doPaging() {
fetchProducts(page: pageNumber , completion: { success in
if let products = success as? Products
{
DispatchQueue.main.async {
self.products.append(contentsOf:products)
self.isWating = false;
self.productTableView.reloadData()
}
}
})
}
func fetchProducts(page: Int, completion: @escaping ((AnyObject) -> Void)) {
// URLSession call here
}
但是,以下方法清楚地表明,restful 调用将在后台线程中发生,一旦完成,就更新 UI 和对象。
func doPaging() {
DispatchQueue.global(qos: .background).async {
// Background Thread
fetchProducts()
DispatchQueue.main.async {
self.pageNumber += 1
self.productTableView.reloadData()
self.isWating = false
}
}
}
func fetchProducts(page: Int) {
// URLSession call here
}
我对完成 block 方法与 DispatchQueue 感到困惑。
推荐哪一个?
最佳答案
在第一种方法中,您调用内部使用 NSURLSession 的方法 fetchProducts()
。使用 NSURLSession 的 REST 调用在后台运行,并且在 REST 调用完成后,将调用任务的完成。在该完成中,您调用 fetchProducts()
的完成处理程序。这种方法对我来说似乎很好。
在第二种方法中,您使用全局后台队列并异步调用 NSURLSession API(我假设是这样),并且不等待调用完成。主队列上的代码将立即被调用,此时 NSURLSession 任务可能已完成,也可能未完成。 所以,这种方法是有问题的。
关于ios - 完成 block 方法与DispatchQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50940183/