核心数据和线程

Dun*_*ill 4 iphone core-data thread-safety ipad ios

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

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

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

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

我的问题是步骤1.始终返回零记录,并且步骤2.正在工作并返回正确的记录计数.

已完成一些测试问题1.由于线程正在运行,如果我在同一个线程上发送请求,那么托管对象在其上创建就可以完美地运行.

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

谢谢

occ*_*lus 11

核心数据中并发的黄金法则是:每个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文档等)并做到这一点.