魔法记录,保存和NSFetchedResultsController

Mar*_*cin 8 core-data objective-c nsfetchedresultscontroller magicalrecord

不确定这是魔术记录保存方式的问题,还是我只是在某个地方犯了一个菜鸟错误.

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

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

[self.tableView reloadData]在FRC controllerDidChangeContent委托方法中做得很天真.

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

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

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

Mar*_*cin 8

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

我想从FRC正在观看rootSavingContext而不是其中一个孩子的观点来看,这是有道理的.尽管如此,我还是会想,因为我在同一个线程上进行所有操作都不会成为问题.

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