核心数据主要上下文并发性

所以我在过去的几个星期里一直在阅读和使用Core Data,并且使用以下设置来实现我的Core Data堆栈:

保存上下文 – 与商店绑定的根上下文,位于PrivateQueue上

主要上下文 – 在主线程上运行,保存上下文的subprocess

编辑上下文 – 在任何线程中按需创build,以编辑背景中的UI数据作为主要上下文的子项

有了这个设置,我没有任何问题,我已经采取了必要的预防措施,以防止多个背景编辑上下文同时调用[editMoc保存],但我没有看到相对于主线程是如何安全的/上下文。 具体来说,我在使用这个设置时看到的所有代码如下所示:

[edit performBlock^{ [edit save:nil]; [main performBlock:^{ [main save:nil]; [root performBlock...] }]; }]; 

现在我无法想象的是这样的:每当子环境保存时,数据就被传播到主环境中,但是没有任何事情发生,以确保数据当前不被读取/执行在主要的背景下,对吗? 基本上,我觉得像这样的事情会更合适:

 [edit performBlock^{ dispatch_async(dispatch_get_main_queue(), ^{ [edit save:nil]; }); [main performBlock:^{ [main save:nil]; [root performBlock....] }]; }]; 

至less如果这样做,我们会确保传播相对于主线程/ UI是安全的,不是吗? 这种关系与我的另一个问题“为什么主要的语境真的应该和主线程有关呢?” 现在,如果我需要执行读取操作,我可以从主要的上下文中进行读取,而且我可以理解,在主线程中它是有意义的,但是如果传播只是“随时”发生的(因为我们不是在主线程中执行它们)将主线程绑定到底的最终目的是什么? 我甚至不需要去做,因为数据似乎已经从孩子保存的主要背景中抵达了,是吗? 从那里一个简单的[tableView重载]就足够了。

任何帮助表示赞赏!

编辑:

所以我想我已经find了我的问题的答案,那就是Core Data实际上是在内部使用正确的线程将更改从子上下文推送到父上下文(即使用父上下文的队列 – 在这种情况下会成为主队列)。 这意味着实际上它必须等待主线程上发生的任何其他事情,这些事情可能在使用主数据之前就已经使用了这些数据。