gpt4 book ai didi

ios - NSAsynchronousFetchRequest - 应该在主线程上显式更新

转载 作者:行者123 更新时间:2023-11-28 14:06:00 26 4
gpt4 key购买 nike

我正在创建一个 NSAsynchronousFetchRequest,其中有一个完成 block 。

我见过各种示例,其中一些包括在主线程上使用调度队列,而另一些则没有。例如,Ray Wenderlich 核心数据手册不会在主线程上调用结果。

执行结果的时候要不要回到主线程。最初我认为我必须这样做,但现在我不需要了。一些明确的清晰度会很棒。

fun exampleFetch(_ completionHandler: @escaping () -> () {
let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "Example")

let asyncFetchRequest = NSAsynchronousFetchRequest<NSDictionary>(fetchRequest: fetchRequest) { result in
// DispatchQueue.main.async { // is this needed
completion()
//}
}

managedContext.performChanges {
do {
try self.managedContext.execute(asyncFetchRequest)
} catch let error {
print("error trying to fetch saving objects:", error.localizedDescription)
}
}
}

最佳答案

您不应该在主队列上显式调用完成处理程序。让调用者决定如何处理它。如果有的话,请记录将在任意队列上调用完成处理程序。然后调用您的 exampleFetch 方法的客户端知道他们有责任确保在任何需要的队列上处理结果。

这给了客户端更多的控制权。

这也避免了很多不必要的线程切换。客户端可能会从后台队列调用 exampleFetch,并且可能希望在后台处理结果。如果您显式地将完成放在主队列中,则客户端需要显式切换回后台队列来处理结果。这是两个不必要的队列切换,而且在主队列上浪费了精力。

关于ios - NSAsynchronousFetchRequest - 应该在主线程上显式更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52973049/

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