【发布时间】:2018-06-20 04:23:10
【问题描述】:
我已经实现了以下完成块,一个块完成,然后我相应地更新 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
}
我在完成块方法和 DispatchQueue 之间感到困惑。
推荐哪一个?
【问题讨论】:
-
你的两个
doPaging方法根本不相似。第一个调用fetchProducts,而第二个没有。 -
@rmaddy,添加了缺失的部分。
-
两种方法都试过了吗?请注意事物执行顺序的巨大差异。了解此类事情的最佳方法是尝试。实验。在这种情况下,您将通过实验而不是发布问题学到更多。一旦你得到你不太理解的结果,然后发布一个问题要求澄清。
-
如果
fetchProducts是异步的,则使用第一个选项。如果fetchProducts与第二个同步。
标签: ios swift asynchronous