Objective c 魔法记录、保存和NSFetchedResultsController

Objective c 魔法记录、保存和NSFetchedResultsController,objective-c,core-data,nsfetchedresultscontroller,magicalrecord,Objective C,Core Data,Nsfetchedresultscontroller,Magicalrecord,我不确定这是不是魔法唱片的保存方式有问题,或者我只是在某个地方犯了个错误 我正在使用NSFetchedResultController(FRC)和UITableView来显示实体列表,当用户点击“添加”按钮时,会推送一个带有编辑器的新视图控制器,并使用[MyEntity MR_createEntity]创建一个新实体。用户可以在此处添加通过关系添加到主实体的其他实体。当用户点击此视图控制器中的“保存”时,使用[[NSManagedObjectContext MR\u contextForCurr

我不确定这是不是魔法唱片的保存方式有问题,或者我只是在某个地方犯了个错误

我正在使用NSFetchedResultController(FRC)和UITableView来显示实体列表,当用户点击“添加”按钮时,会推送一个带有编辑器的新视图控制器,并使用
[MyEntity MR_createEntity]
创建一个新实体。用户可以在此处添加通过关系添加到主实体的其他实体。当用户点击此视图控制器中的“保存”时,使用
[[NSManagedObjectContext MR\u contextForCurrentThread]MR\u Save]保存上下文

NSFetchedResultsController似乎在更新,但当我点击编辑实体时,没有子实体。调试似乎表明,即使实体已保存,FRC仍具有具有临时ID的实体

我在FRC
controllerDidChangeContent
delegate方法中执行一个简单的
[self.tableView重载数据]

重新启动应用程序将加载正确的实体,并且子实体将正确显示在编辑器视图控制器中

看起来FRC响应“主线程”保存事件,但实际上保存发生在后台线程上,所以FRC看不到它。我已经检查过了,所有“我的”操作(设置FRC、创建和获取实体)都发生在主线程上下文中


我尝试在MR_rootSavingContext上侦听更改通知,并将它们与主线程上下文合并,这在某种程度上起到了作用,但最终在FRC中出现了重复的行(一个是正确的“永久”实体,另一个是临时实体)。

好的,我不确定这是否是“正确的方法”但我发现,如果我在MR_rootSavingContext而不是使用“inContext”版本的
MR_fetchAllSortedBy
在默认上下文中创建NSFetchedResultsController,它就可以正常工作

我想从FRC现在关注的是rootSavingContext而不是它的一个孩子的角度来看,这是有道理的。尽管如此,我还是会想,既然我在同一个线程上执行所有操作,那就不成问题了


更新:这种方法唯一的问题是,如果我只是使用
[frc objectAtIndexPath:
抓取实体,将其交给编辑视图控制器,那么它就不再处于默认上下文中。通过使用NSManagedObjectContext的
existingObjectWithID
在默认上下文中重新获取实体,解决了这个问题。虽然感觉不是很好,但它对我很有用。

知道这是一个古老的答案,但上面所有的答案对我都不起作用,希望能对未来的读者有所帮助

对我来说,这个问题是因为试图使用以前与iCloud一起使用的sqlite文件来设置一个纯本地存储

基本上,我试着用我的CoreData应用程序实现iCloud,用ubiquity容器等完成了设置的基本步骤,但由于这似乎会导致固有的不稳定性(为什么CoreData和iCloud仍然不合拍?!),我又恢复了,但cocoa不喜欢你这样回溯

幸运的是,我没有在live app中这样做,因此更改相对比较容易,因为它只会影响开发设备,但如果您在live app中从iCloud移动到本地商店,我认为您可能需要查看以下解决方案之一:


我有一个类似的问题,你可以发现,不幸的是,我不知道是什么原因造成的,但我也有同样的情况,我的默认上下文似乎不是最新的(从某种意义上说)。我也是,我刚刚对法比亚诺的问题发表了评论。使用MR_rootSavingContext似乎对我没有帮助,我可能会使用MR的早期版本,我知道它是有效的。+1因为这解决了我的问题,请参阅我的答案