有很多CoreData处理并发性几个方面并发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
因为我们需要使用performBlock在childCo ntext及更高版本保存或执行提取或任何关于mainContext,这两种方法之间会有什么区别?
我在Florian Kugler's blog上看到前面的方法在主线程上(我尝试过,没有),后者是首选的方法。但是我看过的其他每个网站似乎都喜欢以前的父母/孩子背景。
为了让事情更加令人困惑,在RayWenderLich的CoreData手册(参考第10章)中,他们已经使用了这两种方法,但没有解释原因。
阻塞主线程的事情是必须在MainQueue(mainContext)上完成的I/O操作。因此,批量更新在I/O上仍然具有相同的效果。而对于异步获取请求,由于存在一个PersistantStoreCoordinator,它将被锁定直到它完成CRUD,这仍然会导致UI被阻止。我错了吗? – Mehrdadmaskull
你说得对。但在数据同步我在dispatch_async()块内调用它,它只是主要的MOC保存调用,所以想成为一个问题。在其他地方,我没有任何沉重的操作。因此,维持3级MOC对我来说是值得的。 – kaushal
这就是为什么要创建新记录,我使用临时MOC,稍后将保存到主要MOC。三级父母孩子MOC不会阻止你的主线程,但批量更新和创建操作的速度很慢,每种方法都有散文和锥体,这取决于你的应用行为。 – kaushal