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

时间:2018-10-24 15:41:35

标签: ios swift

我正在创建一个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)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

这为客户端提供了更多控制权。

这也防止了很多不必要的线程切换。客户端可能从后台队列调用exampleFetch,并且可能要在后台处理结果。如果将完成内容明确地放在主队列中,则客户端需要明确地切换回后台队列以处理结果。那是两个不必要的队列切换,这浪费了主队列的时间。