核心数据和线程

我正在使用核心数据的应用程序,我知道这不是线程安全的,但正在努力了解如何正确地pipe理这个。 让我解释我到目前为止…

我创build了一个启动pipe理对象的单例,然后可用于所有其他类,因为所有类都接收到相同的pipe理对象地址,所以这似乎正常工作。

然后我有两个按这个顺序执行的类

  1. 数据加载。 这将获得logging计数,如果零加载核心数据库。
  2. Tableview然后显示在步骤1中存储的数据。

我的问题是第1步。总是返回零logging,第2步。工作并返回正确的logging计数。

已经做了一些testing与1的问题。是由于它的线程运行,如果我发送请求在同一个线程上创build的pipe理对象完美的作品。

那么,为什么它在第一课。我必须确保请求是在正确的线程,但在第二课。它只是运作,或者它只是纯粹的运气。 有线程和核心数据的推荐和文档化方法吗?

谢谢

核心数据并发的黄金法则是: 每个NSManagedObjectContext必须只能从一个线程访问 – 即创build的线程 。 而且,一个被pipe理的对象只能用于你获取的MOC – 不会传递给其他MOC!

但是您可以在线程之间共享一个持久性存储协调器,因为每个MOC在使用PSC时lockingPSC – 所以常见的设置就是为多个MOC提供一个PSC。

更多信息:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

如果你的情况2在使用不同的线程时似乎在工作,我会说这是更坏的运气,并不是正确的做法。 不要依靠运气,遵循上面提到的规则,一切都会好的。

额外的相关阅读:

CoreData是什么意思是不是线程安全的?

http://www.cocoanetics.com/2012/07/multi-context-coredata/

http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

http://digitalflapjack.com/blog/2010/jun/11/parallelcoredata/

http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

作为一般规则 ,值得记住的是,当API或文档说“不要做X”时, 并不意味着每次都会失败或遇到问题 – 这只是意味着它可能会回到有一天你会困扰你 不要把事情弄糟,找出你可以做什么(API文档等),并做到这一点。