我正在开发一个使用核心数据的应用程序,我知道这不是线程安全的,但我很难理解如何正确管理它。让我解释一下我到目前为止的情况......
我创建了一个初始化托管对象的单例,然后可供所有其他类使用,这似乎工作正常,因为所有类都接收到相同的托管对象地址。
然后我有两个按此顺序执行的类...
- 数据加载。这将获取记录数,如果为零则加载核心数据库。
- 然后显示第 1 步中存储的数据的 TableView 。
我的问题是第 1 步总是返回零条记录,而第 2 步正在运行并返回正确的记录数。
对 1 的问题进行了一些测试。是由于它运行的线程,如果我在创建托管对象的同一线程上发送请求,它会完美运行。
那么为什么它在第 1 类中。我必须确保请求在正确的线程上但在第 2 类中。它只是有效,或者只是纯粹的运气。是否有针对线程和核心数据的推荐和记录方法?
谢谢
最佳答案
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 文档等)然后去做。
关于iphone - 核心数据和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662120/