在闭包内调用完成处理程序的问题

Posted

技术标签:

【中文标题】在闭包内调用完成处理程序的问题【英文标题】:Issue with a completion handler called inside a closure 【发布时间】:2017-05-30 17:11:18 【问题描述】:

我经常发现像下面的代码这样的 sn-ps,其中 NSPersistentContainer 在闭包中初始化并分配给一个变量。

但是我不认为这段代码是最佳的,因为函数loadPersistentStores 的完成处理程序不会与其余代码同步执行。

这意味着storeDescription 在下一行代码中创建容器后无法立即使用。正确的?如果是这样,什么是优雅的解决方案?

lazy var persistentContainer: NSPersistentContainer = 
    let container = NSPersistentContainer(name: "Test")
    container.loadPersistentStores(completionHandler:  (storeDescription, error) in
        if let error = error as NSError? 
            fatalError("Unresolved error \(error), \(error.userInfo)")
        
    )
    return container
()

【问题讨论】:

【参考方案1】:
    不要懒惰地实例化persistentContainer,而是早点做。 在完成处理程序中也包含相关的代码行。 我个人不喜欢带有 store-is-ready-bool 的东西。 如果不产生问题,请保持原样。

【讨论】:

我明白了。我对第 3 点有疑问:如果你个人不喜欢这个解决方案,你为什么建议它? :) 有更好的吗? (我也不喜欢) 这是一个非常简单的解决方案,不建议它是不公平的,因为“优雅的解决方案”只是偏好。我已经使用过几次 CoreData 模板,并且从来没有遇到过这个懒惰实例化的持久容器的问题,如果它没有问题,我建议就这样离开它。

以上是关于在闭包内调用完成处理程序的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何存储闭包完成处理程序以供以后调用?

发出调用快速完成处理程序关闭的问题

从委托的源 ViewController 调用异步闭包

在 Swift 中遇到完成处理程序和闭包问题

Swift 闭包完成处理程序

无法从完成处理程序取回数组