使用在主队列上运行的NSManagedObjectContext
和在私有队列上运行并且让它们共享NSManagedObjectContext
的辅助NSPersistentStoreCoordinator
是与网络同步的常见模式服务,同时保持UI响应。
我想将NSPersistentContainer
设置为viewContext
和backgroundContext
(NSManagedObjectContext
}。
我看到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
吗?
答案 0 :(得分:0)
虽然我没有以与上面提到的完全相同的方式处理问题,但我一直在使用NSPersistentContainer和背景上下文进行一些工作,这就是我找到的。
如果您实现上述模式,我怀疑您的代码可能会失败。原因是:后台上下文是使用自己的私有队列创建的,因此如果在主队列上设置后台上下文,它将破坏模式并使事情变得难看。如果在后台队列上设置后台上下文,那么它应该没问题,但是你必须确保后台上下文永远不会在另一个队列/线程上使用。
Xcode的beta 6(虽然运行时测试版8已经出现在今天),我发现使用performBackgroundTask
作为代码在后台做事最有帮助和最有弹性的方法在它自己的闭包中运行:是否适用于你将取决于你如何与Web服务同步。
我使用的另一种模式是在自己的队列中启动后台任务,在启动过程中,从持久容器(我以Singleton模式存储)中获取一个新的后台上下文,以便在该任务期间使用。任务完成后,ARC将回收背景上下文。
与往常一样,我们仍处于测试阶段,所以事情会发生变化,恕不另行通知。
答案 1 :(得分:0)
您是否考虑过使用performBackgroundTask
?
https://developer.apple.com/reference/coredata/nspersistentcontainer/1640564-performbackgroundtask