当一个托管对象在 moc A 中被删除时,它还会出现在 moc B 中吗?

Posted

技术标签:

【中文标题】当一个托管对象在 moc A 中被删除时,它还会出现在 moc B 中吗?【英文标题】:When a managed objects is deleted in moc A will it still be present in moc B? 【发布时间】:2017-01-07 14:34:54 【问题描述】:

想象两个托管对象上下文,moc A 和 moc B 填充了相同的对象集并共享相同的持久存储协调器。现在,我从 moc A 中删除一个对象并保存上下文。它还会存在于 moc B 中吗?

我测试了那个场景,似乎这些对象仍然在 moc B 中徘徊,但我不确定它们在那里是否安全,即在某种意义上我可以将它们写回商店。

我问的原因是我想在 Core Data 支持的应用程序中实现剪切/复制/粘贴,但在复制时我不想将实际对象写入粘贴板,而是使用 promise/数据提供者机制。

假设用户复制了一堆托管对象,我在粘贴板上写了一个承诺(对象 ID 数组)。然后,假设用户删除了所有这些对象,但后来想将它们粘贴回某处。我的数据提供者将无法获取它们,因为它们已被删除。

但我想知道如果我将它们存储在私有托管对象上下文中以进行保管会发生什么。从主上下文中删除后,它们会从保管上下文中消失吗?

【问题讨论】:

【参考方案1】:

问题Will it still exist in moc B 的答案是:这取决于:)

因此,如果您的代码在 ISO 10(或更高版本)上运行,则答案是 Yes, it will still exist,因为上下文 A 具有不同的 Generation 数据。

如果您的代码在 ios 9(或更早版本)上运行,答案还是:视情况而定。如果上下文 B 中的任何对象是fault,那么如果您尝试访问任何属性(来自此故障的对象),您的应用程序将崩溃,例如CoreData could not fulfill a fault。否则,您可以访问这些数据(它们保存在原始缓存中)。但是(可能我从未尝试过)如果您尝试保存被其他上下文删除的对象,那么我预计 CoreData 会出错。

Will they disappear from the safekeeping context after they're deleted from the main context?的答案 是: 不,它们不会消失,但在 iOS 9(或更早版本)中,如果您有一些 faults,您将永远无法实现它们(因为它们不再存在于任何地方)。

【讨论】:

以上是关于当一个托管对象在 moc A 中被删除时,它还会出现在 moc B 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

当 UI 允许新对象时如何处理取消

在后台线程中更新托管对象上下文

保存托管对象上下文会在 iOS 5 的 performBlock 中创建死锁

尝试访问托管对象属性时的 EXC_BAD_ACCESS

如何安全地删除未保存的托管对象?

如何通过应用程序委托使用托管对象上下文实例化还原的视图控制器?