使用专用队列和主队列NSManagedObjectContext设置NSPersistentContainer

时间:2016-08-27 12:49:53

标签: swift core-data

使用在主队列上运行的NSManagedObjectContext和在私有队列上运行并且让它们共享NSManagedObjectContext的辅助NSPersistentStoreCoordinator是与网络同步的常见模式服务,同时保持UI响应。

我想将NSPersistentContainer设置为viewContextbackgroundContextNSManagedObjectContext}。

我看到NSPersistentContainer已经有viewContext属性。如何设置和添加NSPersistentContainer backgroundContext属性?

这是我到目前为止所做的。

class PersistentContainer: NSPersistentContainer {

    override init(name: String, managedObjectModel model: NSManagedObjectModel) {
        super.init(name: name, managedObjectModel: model)
    }

    private var _backgroundContext: NSManagedObjectContext?
    var backgroundContext: NSManagedObjectContext {
        get {
            if _backgroundContext == nil {
                _backgroundContext = self.newBackgroundContext()
                _backgroundContext!.persistentStoreCoordinator = self.persistentStoreCoordinator
            }

            return _backgroundContext!
        }
    }
}

除了子类化之外,还有更好的方法可以将backgroundContext属性添加到NSPersistentContainer吗?

2 个答案:

答案 0 :(得分:0)

虽然我没有以与上面提到的完全相同的方式处理问题,但我一直在使用NSPersistentContainer和背景上下文进行一些工作,这就是我找到的。

如果您实现上述模式,我怀疑您的代码可能会失败。原因是:后台上下文是使用自己的私有队列创建的,因此如果在主队列上设置后台上下文,它将破坏模式并使事情变得难看。如果在后台队列上设置后台上下文,那么它应该没问题,但是你必须确保后台上下文永远不会在另一个队列/线程上使用。

Xcode的beta 6(虽然运行时测试版8已经出现在今天),我发现使用performBackgroundTask作为代码在后台做事最有帮助和最有弹性的方法在它自己的闭包中运行:是否适用于你将取决于你如何与Web服务同步。

我使用的另一种模式是在自己的队列中启动后台任务,在启动过程中,从持久容器(我以Singleton模式存储)中获取一个新的后台上下文,以便在该任务期间使用。任务完成后,ARC将回收背景上下文。

与往常一样,我们仍处于测试阶段,所以事情会发生变化,恕不另行通知。

答案 1 :(得分:0)