【发布时间】:2018-10-24 15:41:35
【问题描述】:
我正在创建一个内部有一个完成块的 NSAsynchronousFetchRequest。
我见过各种例子,其中一些包括在主线程上使用调度队列,而另一些则没有。例如,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)
}
}
}
【问题讨论】:
-
你要么让开发者这样做,要么不这样做。随你(由你决定。您还可以让用户决定他希望所有完成都发生在哪个队列上。例如,
CBPeripheralManager使用委托(不是闭包)让我们决定开发:init(delegate:queue:) -
@Larme 澄清一下,asyncFetchRequest 的结果是在后台线程上调用的吗?
-
不知道,待测。它是在不同的队列上运行,还是在同一个队列上运行?例如,如果您在后台队列中启动 fetch,是否会在同一个队列中调用完成?
-
@Larme 不知道我可以测试这个。会调查的,谢谢!
-
if Thread.isMain,或类似的东西。