2016-05-07 31 views
0

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

回答

0

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

  1. 只有一个托管对象上下文(MOC)应该附加到persistentStoreCoordinator是避免MOC锁定,CURD操作解锁的基本规则。
  2. 每个MOC应该附加一个线程,如主线程MOC,后台线程MOC。
  3. 您不能通过MOC(线程)将管理对象从一个MOC(线程)传递到另一个,在这种情况下只需传递ObjectID。

为了实现这三条规则,苹果引入了亲子MOC方法。在各种帖子上有这么多的组合,但是每个堆栈(父子MOC方法)都高度依赖于应用程序数据的可用性。

我已经实现了作为我的主要MOC上下文使用persistentStoreCoordinator,并创建后台线程子MOC进行数据同步, 和更多本地子MOC为每个视图控制器创建新的记录屏幕。这对我很有用,并且在数据库上插入3500条记录进行测试。 这样做的好处是我通过我的主MOC获取更新的服务器同步数据。

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

+0

阻塞主线程的事情是必须在MainQueue(mainContext)上完成的I/O操作。因此,批量更新在I/O上仍然具有相同的效果。而对于异步获取请求,由于存在一个PersistantStoreCoordinator,它将被锁定直到它完成CRUD,这仍然会导致UI被阻止。我错了吗? – Mehrdadmaskull

+0

你说得对。但在数据同步我在dispatch_async()块内调用它,它只是主要的MOC保存调用,所以想成为一个问题。在其他地方,我没有任何沉重的操作。因此,维持3级MOC对我来说是值得的。 – kaushal

+0

这就是为什么要创建新记录,我使用临时MOC,稍后将保存到主要MOC。三级父母孩子MOC不会阻止你的主线程,但批量更新和创建操作的速度很慢,每种方法都有散文和锥体,这取决于你的应用行为。 – kaushal

相关问题