魔法记录,保存和NSFetchedResultsController

问题描述:

不知道这是Magical Record保存方式的问题,还是我只是在某处出现noob错误。我用NSFetchedResultController(FRC)和UITableView来显示实体列表,当用户点击“添加”一个新的视图控制器与编辑器被推动,一个新的实体创建与[MyEntity MR_createEntity]。用户可以在这里添加通过关系添加到主实体的其他实体。当用户点击“保存”在这个视图控制器上下文保存使用[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]魔法记录,保存和NSFetchedResultsController

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

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

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

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

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

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

我想这是有道理的,FRC现在正在观看rootSavingContext而不是它的一个子节点。尽管如此,我还是会想,因为我正在同一个线程上进行所有的操作,这不会成为问题。

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

+0

我有一个类似的问题,你可以找到http://*.com/questions/11212702/nspredicate-not-executed不幸的是我不知道是什么造成的,但我也有相同的情况,似乎我的默认上下文并不真正最新(某种意义上)。 –

+0

我也是,我刚才评论了法比亚诺的问题。使用MR_rootSavingContext似乎没有帮助我,我可能会使用MR的早期版本,我知道这很有用。 –

+0

+1因为这解决了我的问题,请参阅我的答案http://*.com/questions/11212702/nspredicate-not-executed/11407413#comment15080320_11407413 – Otto

意识到这是一个老的答案,但以上都不是为我工作,希望将有助于未来的读者

对我来说,这个问题是通过使用以前一直是一个SQLite文件试图建立一个纯粹的本地存储所致与iCloud一起使用。

基本上我试图用我的CoreData应用程序实现iCloud,做了基本的步骤来设置它与一个无处不在的容器等,但后来由于内在的不稳定性,这似乎导致回退(为什么是CoreData和iCloud STILL不要相处?!),但可可并不像你那样回溯。

还好我没有在现场应用做到了这一点,因此相对容易改变,因为它只会影响发展的设备,但如果你从iCloud中移动到本地存储在现场的程序,我想可能需要检查这些解决方案之一:

Migrating a Core Data Store from iCloud to local