iphone - 核心数据和线程

标签 iphone ios ipad core-data thread-safety

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

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

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

  1. 数据加载。这将获取记录数,如果为零则加载核心数据库。
  2. 然后显示第 1 步中存储的数据的 TableView 。

我的问题是第 1 步总是返回零条记录,而第 2 步正在运行并返回正确的记录数。

对 1 的问题进行了一些测试。是由于它运行的线程,如果我在创建托管对象的同一线程上发送请求,它会完美运行。

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

谢谢

最佳答案

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 文档等)然后去做。

关于iphone - 核心数据和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662120/

相关文章:

ios - Realm - commitWriteTransaction :outError

iphone - 关闭应用程序后防止屏幕截图

ios - CoreDataBooks 问题断言失败。

ios - iPhone 6 plus 上纵向扩展的分割 View Controller

iphone - 在 iPhone 中显示不同的货币格式

iphone - iPad 和 iPhone 的 apple-touch-icon.png 的尺寸应该是多少?

ipad - 调整ipad大小时动力学js崩溃

iphone - iPhone 版 MGTwitterEngine 教程

ios - 在 iOS 中使用 Cordova 打开本地 pdf

ios - 禁用屏幕顶部的 UIScrollView 弹跳