4

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

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

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

  1. 数据加载。这将获取记录计数,如果为零则加载核心数据库。
  2. 然后显示在步骤 1 中存储的数据的表格视图。

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

已经对 1. 的问题进行了一些测试。由于它正在运行的线程,如果我在创建托管对象的同一个线程上发送请求,它就可以完美地工作。

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

谢谢

4

1 回答 1

11

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

但是您可以在线程之间共享一个持久存储协调器,因为每个 MOC 在使用它时都会锁定 PSC - 所以一个常见的设置就是为多个 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”时,这并不意味着每次做 X 都会失败或遇到问题——它只是意味着它可能会回到一天缠着你。不要让事情碰运气,找出你被允许做的事情(API 文档等)然后去做。

于 2013-02-02T13:09:38.090 回答