删除对属于 ManagedObjectContext 的 ManagedObjects 的所有引用
Posted
技术标签:
【中文标题】删除对属于 ManagedObjectContext 的 ManagedObjects 的所有引用【英文标题】:Remove all references to ManagedObjects belonging to a ManagedObjectContext 【发布时间】:2014-05-18 21:59:59 【问题描述】:我希望将 iCloud 与 Core-Data 管理的 SQLite 数据库集成(仅在 ios 7 及更高版本上)。我一直在阅读 Apple 关于将 Core Data 与 iCloud 结合使用的指南 (https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingCoreDataWithiCloudPG.pdf)。
引用指南的话,“Core Data 发布 NSPersistentStoreCoordinatorStoresWillChangeNotification 通知。在通知处理程序中,您重置托管对象上下文并删除对现有托管对象的任何引用。”
在 MOC 上调用 -reset 来重置它不是问题,问题在于他们说需要删除对托管对象的所有引用的部分。我明白为什么需要这样做(因为持久存储正在改变),但我不知道该怎么做。
我所有的核心数据工作都是由一个单例处理的,我最初想发布一个通知,监听类可以将它们所有的托管对象设置为 nil。首先,这听起来不是一个特别好的方法。其次,我有一个 FetchedResultsController 管理一个 tableView,FetchedResultsController 管理它自己的托管对象,因此,据我所知,我不能将它们设置为 nil。
如果您能提供任何关于在这里做什么的建议,我将不胜感激。
提前致谢。
【问题讨论】:
【参考方案1】:我处理此类情况的方式是在我的应用中发布两条通知:重置前和重置后。
例如,我可能会发布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:
来刷新对象。
【讨论】:
这很好,德鲁,谢谢。有点跑题了,但你是否知道在等待 Core Data 与新的/现有的通用存储返回之前,是否有一种方法可以检查 iCloud 中是否已经存在该应用的通用存储? 我认为没有万无一失的方法。您可以使用元数据查询来查看那里是否有事务日志文件,但这不能保证,因为另一台设备可能只是上传数据缓慢。 啊,好的。该模型基于数据库中只有一个“用户”对象,并且应用程序的设置过程涉及用户输入用户对象的信息。您建议如何处理以下情况:用户有两台设备,一台安装了应用程序并启用了 iCloud(已上传数据或正在上传数据),另一台设备作为应用程序的全新安装.如果我在 CD 对 iCloud 执行操作时继续进行用户设置,则用户输入了他们不需要的信息。理论上我可以合并数据(?),但这并不能带来出色的用户体验。 我认为重复数据删除/合并可能是您需要做的。另一种选择可能是通过键值存储传递用户名,或者只是一个指示存在的标志。 完全忘记了键值存储,谢谢。刚刚从 NSConf 看了你的 Emsembles 演讲(顺便说一句,很棒)。通过使用 Ensembles,这是否意味着会有我创建的 PS(并传递给 Ensembles),以及设备上由 Core Data 管理的后备存储?以上是关于删除对属于 ManagedObjectContext 的 ManagedObjects 的所有引用的主要内容,如果未能解决你的问题,请参考以下文章