我正在开发一个使用核心数据的应用程序,我知道这不是线程安全的,但很难理解如何正确管理它。让我解释一下到目前为止......
我创建了一个单例,启动了托管对象,然后可供所有其他类使用,这似乎正常工作,因为所有类都接收到相同的托管对象地址。
然后我有两个按此顺序执行的clases ......
我的问题是第1步。总是返回零记录,第2步。正在工作并返回正确的记录数。
完成了对问题的一些测试1.由于线程正在运行,如果我在同一个线程上发送请求,那么在托管对象上创建它就完美无缺。
那么为什么它在第1类中。我必须确保请求在正确的线程上,但在第2类。它只是工作,或者它只是纯粹的运气。是否有针对线程和核心数据的推荐和文档化方法?
由于
答案 0 :(得分:11)
Core Data中并发的黄金法则是:每个NSManagedObjectContext只能从一个线程访问 - 它是在上创建的线程。此外,托管对象只能与您提取的MOC一起使用 - 不会将其传递给其他MOC!
但是您可以在线程之间共享持久性存储协调器,因为每个MOC在使用时都会锁定PSC - 因此常见的设置只是为多个MOC设置一个PSC。
更多信息:
如果您的情况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文档等)并做到这一点。