魔法记录,保存和NSFetchedResultsController

时间:2012-06-11 05:07:33

标签: objective-c core-data nsfetchedresultscontroller magicalrecord

不确定这是Magical Record保存方式的问题,还是我只是在某个地方犯了一个noob错误。

我正在使用NSFetchedResultController(FRC)和UITableView来显示实体列表,当用户点击“添加”新的视图控制器并推送编辑器时,将使用[MyEntity MR_createEntity]创建新实体。用户可以在此添加通过关系添加到主实体的其他实体。当用户点击此视图控制器中的“保存”时,将使用[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]

保存上下文

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

我在FRC [self.tableView reloadData]委托方法中做了一个天真的controllerDidChangeContent

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

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

我尝试在MR_rootSavingContext上侦听更改通知并将它们与主线程上下文合并,这种方式有效但我最终在FRC中使用了重复行(一个是正确的“永久”实体,一个是临时实体)

2 个答案:

答案 0 :(得分:8)

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

我认为从FRC现在正在观看rootSavingContext而不是其中一个孩子的观点来看,这是有道理的。不过,我会想到,因为我在同一个线程上进行所有操作,这不是一个问题。

更新:这种方法唯一的问题是如果我只是使用[frc objectAtIndexPath:]抓取实体将其提供给编辑视图控制器,那么它就不再是默认上下文了。通过使用NSManagedObjectContext的existingObjectWithID在默认上下文中重新获取实体来解决此问题。仍然不是所有人都感觉很正确,但它对我有用。

答案 1 :(得分:0)

意识到这是一个陈旧的答案,但以上都没有为我工作,希望能帮助未来的读者

对我来说,问题是由于尝试使用之前与iCloud一起使用的sqlite文件设置纯本地存储而引起的。

基本上我尝试用我的CoreData应用程序实现iCloud,做了基本的步骤,用普遍容器等设置它,但后来由于这似乎导致的内在不稳定性而回复(为什么CoreData和iCloud STILL不要相处?!),但可可不喜欢你这样回溯。

幸运的是我没有在实时应用程序中完成此操作,因此它相对容易更改,因为它只会影响开发设备,但如果您从iCloud迁移到实时应用程序中的本地商店,我认为< / em>您可能需要查看其中一个解决方案:

Migrating a Core Data Store from iCloud to local