gpt4 book ai didi

ios - 完成 block 方法与 DispatchQueue

转载 作者:搜寻专家 更新时间:2023-11-01 06:28:19 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com