核心数据新手在这里发言。
在我的应用程序中,我有两个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)。
但什么都没发生!只有当我重新启动应用程序时,我才会看到我之前从网上获取的内容!
我在哪里做错了?
提前谢谢!
答案 0 :(得分:1)
重新加载表不会像您期望的那样从持久性存储中重新获取项目。重新加载表是“UI”级别操作,并且获取数据是在模型级别。虽然这适用于主NSManagedObjectContext
中发生的任何更改,但这不会导致主NSManagedObjectContext
了解其他NSManagedObjectContext
中发生的更改。
根据您的设计,您需要执行以下操作之一:
-mergeChangesFromContextDidSaveNotification:
。NSManagedObjectContext
NSFetchedResultsController
更改NSFetchedResultsController
将通知其代理人(通常是您的视图控制人员),并为您提供更新表格视图的机会。我怀疑你没有做其中一项,从而打破了一系列事件。
我的文章中有一个关于MDN的多线程通知的可靠示例。如果你不熟悉MDN,我强烈建议你去看看。