在CoreData中处理并发的方法很少
其中一个是使用父/子managedObjectContexts,如下所示:
let mainContext = NSManagedObjectContext( concurrencyType: .MainQueueConcurrencyType)
let childContext = NSManagedObjectContext( concurrencyType: .PrivateQueueConcurrencyType)
childContext.parentContext = mainContext
另一种方法是让main和child上下文使用相同的persistentStoreCoordinator,如下所示:
let mainContext = NSManagedObjectContext( concurrencyType: .MainQueueConcurrencyType)
let childContext = NSManagedObjectContext( concurrencyType: .PrivateQueueConcurrencyType)
childContext.persistentStoreCoordinator = mainContext.persistentStoreCoordinator
由于我们需要在 childContext 上使用performBlock,然后在 mainContext 上保存或执行fetch或其他内容,这两者之间会有什么区别方法
我在Florian Kugler's blog上读到前一种方法在主线程上进行处理(我尝试过它并没有),后者是首选方式。但我所看到的其他所有网站似乎都更喜欢以前的父母/子女背景。
为了让事情更加混乱,在RayWenderLich的CoreData一书(参考第10章)中,他们使用了这两种方法而没有解释原因。
答案 0 :(得分:0)
理想情况下,在单个persistentStore核心数据应用程序中有3个简单的规则来实现并发。
为了实现所有这三条规则,苹果引入了亲子MOC方法。各种帖子上有这么多组合, 但每个堆栈(父子MOC方法)在很大程度上取决于应用程序数据的可用性。
我实现了我的主要MOC上下文使用persistentStoreCoordinator,并创建了后台线程子MOC用于数据同步, 每个View控制器的更多本地子MOC用于创建新记录屏幕。这对我来说效果很好,并在DB上插入3500条记录进行测试。 这样做的好处我通过我的主要MOC获得更新的服务器同步数据。
我对方法的批评很少,我会阻止主线程,但你可以利用批量更新,删除,异步获取请求来最小化它。