核心数据&主题

时间:2013-02-02 12:58:31

标签: iphone ios ipad core-data thread-safety

我正在开发一个使用核心数据的应用程序,我知道这不是线程安全的,但很难理解如何正确管理它。让我解释一下到目前为止......

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

然后我有两个按此顺序执行的clases ......

  1. 数据加载。这将获得记录计数,如果零加载核心数据库。
  2. Tableview,然后显示步骤1中存储的数据。
  3. 我的问题是第1步。总是返回零记录,第2步。正在工作并返回正确的记录数。

    完成了对问题的一些测试1.由于线程正在运行,如果我在同一个线程上发送请求,那么在托管对象上创建它就完美无缺。

    那么为什么它在第1类中。我必须确保请求在正确的线程上,但在第2类。它只是工作,或者它只是纯粹的运气。是否有针对线程和核心数据的推荐和文档化方法?

    由于

1 个答案:

答案 0 :(得分:11)

Core Data中并发的黄金法则是:每个NSManagedObjectContext只能从一个线程访问 - 它是在上创建的线程。此外,托管对象只能与您提取的MOC一起使用 - 不会将其传递给其他MOC!

但是您可以在线程之间共享持久性存储协调器,因为每个MOC在使用时都会锁定PSC - 因此常见的设置只是为多个MOC设置一个PSC。

更多信息:

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

如果您的情况2.在使用不同的线程时似乎正在工作,我会说这更不利于运气,并且它不能使它成为正确的事情。不要依赖运气,遵循我上面提到的规则,一切都会很好。

其他相关读物:

What is meant by CoreData is not thread safe?

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”时,意味着做X会失败或每次遇到问题 - 这只意味着它有可能会在某一天回来困扰你。不要遗漏事情,找出你允许做的事情(API文档等)并做到这一点。