在CoreData中处理并发的方法很少
其中之一是使用父/子managedObjectContexts,如下所示:
let mainContext = NSManagedObjectContext( concurrencyType: .MainQueueConcurrencyType)
let childContext = NSManagedObjectContext( concurrencyType: .PrivateQueueConcurrencyType)
childContext.parentContext = mainContext
另一种方法是使主上下文和子上下文都使用相同的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章作为参考)上,他们使用了这两种方法,而没有解释原因。
最佳答案
理想情况下,在单个persistentStore核心数据应用程序中有3条简单的规则可以实现并发。
避免将MOC锁定,在CURD操作上解锁的基本规则是,只有一个受管对象上下文(MOC)应该与persistentStoreCoordinator附加在一起。
每个MOC都应附有一个线程,例如主线程MOC,后台线程MOC。
您不能通过MOC(线程)将托管对象从一个MOC(线程)传递到另一个,在这种情况下,只需传递ObjectID。
为了实现这三个规则,Apple引入了亲子MOC方法。在各种职位上有这么多组合,
但是每个堆栈(父级MOC方法)高度依赖于应用程序数据的可用性。
我已经使用persistentStoreCoordinator实现了我的主要MOC上下文,并创建了后台线程子MOC来进行数据同步,
每个View控制器都有更多本地子MOC,用于创建新记录屏幕。这对我来说将很好地工作,并在数据库上进行了3500条记录插入的测试。
这样做的好处是我可以通过主MOC获得更新的服务器同步数据。
我对这种方法的批评很少,我会阻塞主线程,但是您可以利用批处理更新,删除,异步提取请求将其最小化。
关于ios - 具有多个上下文的核心数据中的并发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37084672/