CoreData的通用上下文

时间:2018-01-12 18:18:58

标签: ios core-data

我在我的类中使用NSPersistentContainer作为依赖项。我发现这种方法非常有用,但是存在一个两难的境地:我不知道我的方法将在哪个线程中被调用。我找到了一个非常简单的解决方案

extension NSPersistentContainer {
    func getContext() -> NSManagedObjectContext {
        if Thread.isMainThread {
            return viewContext
        } else {
            return newBackgroundContext()
        }
    }
}

看起来很棒,但我仍有疑问是否有任何陷阱?如果它正常工作,为什么地球上的核心数据会使我们与其背景混淆?

1 个答案:

答案 0 :(得分:0)

只要您能够忍受其固有的限制,即

,这是可以的
  • 当您在主要队列中时,总是想要viewContext,而不是任何其他人。
  • 当您不在主要队列中时,始终想要创建新的独立上下文。

浮现在脑海中的一些弊端:

  • 如果调用具有异步完成处理程序的方法,则可以在不同的队列上调用该处理程序。如果使用此方法,则可能会获得与拨打电话时不同的上下文。这可以吗?这取决于你在处理程序中做了什么。
  • 在一个背景上下文中的更改不会在其他背景上下文中自动提供,因此您可能会面临多个具有冲突更改的上下文的风险。
  • 该方法暗示了您正在使用的上下文的潜在粗心。了解您正在使用的上下文非常重要,因为在一个上下文中获取的托管对象不能与另一个上下文一起使用。如果你的代码只是说,嘿给我一些上下文,但没有正确地跟踪上下文,你增加了因意外穿越上下文而崩溃的机会。

如果您的非主要排队要求与上述要求相符,那么您最好在performBackgroundTask(_:)上使用NSPersistentContainer方法。你在这里没有添加任何东西。

  

地球上的核心数据让我们对其背景感到困惑?

托管对象上下文是Core Data工作方式的基础部分。因此,跟踪它们是使应用程序不会破坏其数据或崩溃的基本部分。