NSMagedObjectContext,线程和NSFechedResultsController

时间:2010-05-25 23:33:22

标签: iphone core-data

核心数据新手在这里发言。

在我的应用程序中,我有两个NSManagedObjectContext引用相同的NSPersistentStorageController。

一个ManagedObjectContext(c1)位于主线程中 - 创建NSFetchedResultsController时创建 - 第二个ManagedObjectContext(c2)在第二个线程中创建,在后台运行,与主线程分离。

在后台线程中,我从网站上提取一些数据,并在线程的ManagedObjectContext(c2)中插入为拉出数据创建的实体。

同时,主线程无效,显示一个UITableView,其数据显示应该由NSFetchedResultsController提供。

当后台线程完成拉取数据并在c2中插入实体时,c2保存,后台线程在退出之前通知主线程处理已完成。

事实上,我在c2中插入的实体是c1知道的,因为它可以通过[c1 existingObjectWithID:ObjectID错误:& error]询问一个特定的实体;

我希望在这一点上,如果我调用我的tableview reloadData,看到一些行显示我在后台线程中从Web中提取的数据,这要归功于NSFetchedResults控制器,它应该对其ManagedObjectContext的修改作出反应( C1)。

但什么都没发生!只有当我重新启动应用程序时,我才会看到我之前从网上获取的内容!

我在哪里做错了?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

重新加载表不会像您期望的那样从持久性存储中重新获取项目。重新加载表是“UI”级别操作,并且获取数据是在模型级别。虽然这适用于主NSManagedObjectContext中发生的任何更改,但这不会导致主NSManagedObjectContext了解其他NSManagedObjectContext中发生的更改。

根据您的设计,您需要执行以下操作之一:

  • 当主线程收到后台线程保存的通知时,需要调用-mergeChangesFromContextDidSaveNotification:
  • 完成后,您需要保存主NSManagedObjectContext
  • 在保存期间,它会触发NSFetchedResultsController更改
  • NSFetchedResultsController将通知其代理人(通常是您的视图控制人员),并为您提供更新表格视图的机会。

我怀疑你没有做其中一项,从而打破了一系列事件。

实施例

我的文章中有一个关于MDN的多线程通知的可靠示例。如果你不熟悉MDN,我强烈建议你去看看。