删除对属于ManagedObjectContext的ManagedObjects的所有引用

时间:2014-05-18 22:00:00

标签: ios objective-c core-data icloud

我希望将iCloud与Core-Data管理的SQLite数据库集成(仅适用于iOS 7及更高版本)。我一直在阅读Apple关于在iCloud中使用Core Data的指南(https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingCoreDataWithiCloudPG.pdf)。

引用该指南,“Core Data发布NSPersistentStoreCoordinatorStoresWillChangeNotification通知。在通知处理程序中,您重置托管对象上下文并删除对现有托管对象的任何引用。”

在MOC上调用-reset重置它不是问题,问题是他们说需要删除对托管对象的所有引用的部分。我理解为什么需要这样做(因为持久存储正在改变),我不知道如何做到这一点。

我的所有核心数据工作都由一个单独的人处理,我最初想过发布一个通知,而监听类可以将他们所有的托管对象设置为零。首先,这听起来并不是一种特别好的方式。其次,我有一个管理tableView的FetchedResultsController,FetchedResultsController管理它自己的托管对象,因此,据我所知,我不能将它们设置为nil。

我真的很感激有关如何做的任何建议。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我处理这种情况的方法是在我的应用中发布两个通知:在重置之前,以及重置之后。

例如,我可能会发布MYMainContextWillResetNotification,然后重置上下文,然后发布MYMainContextDidResetNotification

任何接收到will-reset通知的控制器都应该释放其托管对象,但也会存储重置后恢复所需的任何信息。通常这将是一个或多个NSManagedObjectID个对象。在某些情况下,您可能不需要存储任何内容,只需在重置后执行提取即可。

典型的方法可能如下所示:

- (void)mainContextWillReset:(NSNotification *)notif
{
    self->noteID = note.objectID;
}

此代码假设有一个单个音符对象的控制器。当重置即将发生时,音符的对象标识符存储在实例变量中。

did-reset通知方法检索笔记。

- (void)mainContextDidReset:(NSNotification *)notif
{
    note = [context existingObjectWithID:noteID error:NULL];
    [self refreshViews];
}

此代码使用existingObjectWithID:error:,但您同样可以进行提取。

使用NSFetchedResultsController,您需要在did-reset方法中调用performFetch:来刷新对象。