具有多个上下文的CoreData中的并发

时间:2016-05-07 05:01:01

标签: ios objective-c swift core-data

在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章)中,他们使用了这两种方法而没有解释原因。

1 个答案:

答案 0 :(得分:0)

理想情况下,在单个persistentStore核心数据应用程序中有3个简单的规则来实现并发。

  1. 只有一个托管对象上下文(MOC)应附加persistentStoreCoordinator是基本规则,以避免MOC锁定,解锁CURD操作。
  2. 每个MOC都应附加一个线程,如主线程MOC,后台线程MOC。
  3. 您无法通过MOC(线程)将托管对象从一个MOC(线程)传递给其他对象,在这种情况下只需传递ObjectID。
  4. 为了实现所有这三条规则,苹果引入了亲子MOC方法。各种帖子上有这么多组合, 但每个堆栈(父子MOC方法)在很大程度上取决于应用程序数据的可用性。

    我实现了我的主要MOC上下文使用persistentStoreCoordinator,并创建了后台线程子MOC用于数据同步, 每个View控制器的更多本地子MOC用于创建新记录屏幕。这对我来说效果很好,并在DB上插入3500条记录进行测试。 这样做的好处我通过我的主要MOC获得更新的服务器同步数据。

    我对方法的批评很少,我会阻止主线程,但你可以利用批量更新,删除,异步获取请求来最小化它。