【问题标题】:Deleting CoreData object & Inverse relationships删除核心数据对象和反向关系
【发布时间】:2012-11-27 09:50:06
【问题描述】:

我有一个对象 (A),它与另一个对象 (B) 具有多对多关系。 此外,B 与 A 具有反比关系。

当我删除 B 时,它仍然显示在 A 的关系计数上,除非我在删除之前手动清除 B 的反向关系。 我希望它同步发生,所以我可以更新 UITableView 并删除 B 的行, 而不是等待 MOC 的保存操作完成。

有什么方法可以在不手动清理 B 的逆的情况下处理这个问题? (我有很多这样的关系,这是不好的做法,很难维持)

谢谢!

【问题讨论】:

    标签: ios core-data relationship inverse


    【解决方案1】:

    如果您在 Xcode 的核心数据模型检查器中将 B 到 A 的反向关系的“删除规则”设置为“无效”,这应该会自动工作。

    有关详细信息,请参阅“核心数据编程指南”中的 Relationship Delete Rules

    【讨论】:

    • 谢谢,但它已经设置为 Nullify。我相信它会在下一次 MOC 保存后更新(尽管在主线程的 MOC 上删除和访问关系),无论如何 +1 链接:)
    • @avishic:你说得对,确实是保存后才更新,我忘了,不好意思。 - 你为表格视图使用获取的结果控制器吗?即使没有保存也应该更新(我认为)。
    【解决方案2】:

    差不多 5 年后(现在是 iOS 10),我偶然发现了同样的问题。

    在我决定通过从几乎所有地方删除saveContext() 来“优化”事情后,应用程序开始崩溃,认为内存中的表示可以保证是正确的(因为默认情况下includesPendingChangestrue)。

    但是我遇到了所描述的问题(因为后来需要更新一些 UITableView,所以应用程序崩溃了)。

    这里有四种不同的方法,其中任何一种都解决了我的问题: (根据我的判断,从最好到最差排序)

    • 删除后调用processPendingChanges()(在NSManagedObjectContext上)
    • 删除后调用refreshAllObjects()(在NSManagedObjectContext上)
    • 删除后调用saveContext()(正如其他人在 cmets 中指出的那样)
    • 只是等待。例如,将依赖于正确数据的代码的执行延迟 0.1 秒左右(使用DispatchQueue.main.asyncAfter)。 (这当然是迄今为止最糟糕的方法,你不应该实施它)


    我仍然不确定的事情:

    • 我尝试在一个单独的非常小的示例项目中复制它,但没有遇到问题。那么根本问题是什么?
    • 这是预期的行为还是错误?它是否记录在任何地方?

    【讨论】:

    • processPendingChanges() 为我解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多