【问题标题】:NSFetchedResultsController and NSOperationNSFetchedResultsController 和 NSOperation
【发布时间】:2010-12-12 16:04:37
【问题描述】:

UITableViewController 中,我将NSFetchedResultsController 用于我的数据。一切正常,除了当我开始在单独的线程中导入一些对象时:我使用NSOperationQueue 将对象插入到我的ManagedObjectContext 中。这发生在单独的视图中。 NSFetchedResultsController 似乎不喜欢这样并写入控制台:

严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。尝试使用 userInfo (null) 为单元格创建两个动画

显然它试图获取新对象。

关于并发的话题,Core Data Programming Guide 表示类似为每个线程使用ManagedObjectContext,但这听起来相当复杂。

我现在不知道是否应该真正创建自己的NSOperation 子类,在其中创建ManagedObjectContext 等等,或者是否可以阻止NSFetchedResultsController 更新一段时间?

我会很感激你的帮助,法比安

【问题讨论】:

  • iOS 5 发布时,我一直处于相同的锁定状态。一旦我在我的详细视图中更改了一个条目,我就会回到主表并且它被锁定了。我的应用程序在 iOS 4 上运行良好。现在每次用户编辑表格中的一行时它都会锁定。 iOS 5 有什么新东西吗?发生了什么变化?

标签: iphone objective-c core-data nsfetchedresultscontroller nsoperation


【解决方案1】:

每个线程都需要NSManagedObjectContext,抱歉!

不仅仅是 NSFetchesResultsController 将访问您的上下文 - coreData 不会获取一些数据,直到您的上下文需要它可能随时被访问。

但是,这只是您需要基于每个线程创建的上下文。只需在您的委托上编写一个创建托管对象上下文的方法,然后在您的每个 NSOperations 中调用它 - 这将使它们每个线程而不是全部使用相同的线程。

您的主线程上的托管上下文也可以使用此方法创建。

【讨论】:

  • 我是否必须在完成导入后以某种方式同步不同的 ManagedObjectContext 或者 PersistentStoreCoordinator 会这样做吗?
  • 当您在托管对象上下文上调用 save 时,它​​将更新底层数据库并生成 NSManagedObjectContextObjectsDidChangeNotification 通知。但是,我从来没有使用过它,我总是自己做通知(通过代表或我自己的通知)。您必须注意在线程之间传递对象,因为这会导致随机崩溃 - 将它们的 id 传递回主线程并从主线程管理的对象上下文中获取它们。
  • 好的,我现在要编码了。您可能想将此添加到您的答案中,它看起来很有帮助:duckrowing.com/2010/03/11/using-core-data-on-multiple-threads
  • 忘记将其添加到我的答案中 - 我将其添加到我的书签中!
  • 对不起,这是否解决了您的问题?我得到了完全相同的错误,但我不是多线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多