gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:36:08 26 4
gpt4 key购买 nike

使用在主队列上运行的 NSManagedObjectContext 和在私有(private)队列上运行的辅助 NSManagedObjectContext 并让它们共享一个 NSPersistentStoreCoordinator是与 Web 服务同步同时保持 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 中?

最佳答案

虽然我没有按照您上面提出的完全相同的方式解决问题,但我一直在使用 NSPersistentContainer 和背景上下文进行一些工作,这就是我所发现的。

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

直到 Xcode 的 beta 6(尽管运行时 beta 8 已经发布),我发现使用 performBackgroundTask 是在后台执行操作的最有帮助和弹性的方法因为代码在其自己的闭包中运行:这是否适合您将取决于您如何与 Web 服务同步。

我使用的另一种模式是在其自己的队列上启动后台任务,并在启动期间从持久容器(我将其存储在单例模式中)获取新的后台上下文以在该任务期间使用。当任务完成时,后台上下文由 ARC 回收。

一如既往,我们仍处于测试阶段,因此如有更改,恕不另行通知。

关于swift - 使用专用队列和主队列 NSManagedObjectContext 设置 NSPersistentContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39181339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com