【问题标题】:Remove all references to ManagedObjects belonging to a ManagedObjectContext删除对属于 ManagedObjectContext 的 ManagedObjects 的所有引用
【发布时间】: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。

如果您能提供任何关于在这里做什么的建议,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: ios objective-c core-data icloud


    【解决方案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 管理的后备存储?
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2016-10-28
    • 2011-01-12
    • 1970-01-01
    • 2023-02-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多