ios - 完成 block 方法与DispatchQueue

标签 ios swift asynchronous

我已经实现了以下完成 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/

相关文章:

ios - UITableViewCell,在切换时隐藏和显示它们

iOS - NSArray indexOfObject 不调用自定义的 isEqual

ios - SplitViewController 中的 DetailViewController 显示位置错误

ios/xcode/coredata : How to mimic ajax call in objective c

javascript - 如何在分页事件中突出显示数据表中的单词

swift - 如何模拟和测试存储字符串的 UserDefaults 计算属性?

ios - Swift 2.2 - NSArray 元素无法匹配 TableViewController 中单元格的 Swift 数组元素类型

ios - 如何在 iOS 中使用真实设备位置?

javascript - 这段代码如何使用 promises 顺序获取 url 并将其顺序加载到 html 中?

java - Micronaut 是否需要异步编程?