【问题标题】:Difference between different "resolve" functions in a custom NSMergePolicy自定义 NSMergePolicy 中不同“resolve”函数之间的区别
【发布时间】:2022-10-18 01:38:58
【问题描述】:

在实现自定义NSMergePolicy 时,有 3 个函数可供重载:

final class MyMergePolicy: NSMergePolicy {

    override func resolve(mergeConflicts list: [Any]) throws {
        // ...
        try super.resolve(mergeConflicts: list)
    }

    override func resolve(optimisticLockingConflicts list: [NSMergeConflict]) throws {
        // ...
        try super.resolve(optimisticLockingConflicts: list)
    }

    override func resolve(constraintConflicts list: [NSConstraintConflict]) throws {
        // ...
        try super.resolve(constraintConflicts: list)
    }
}

所有 3 的文档完全相同,它说:“解决给定列表中的冲突。”,我似乎无法在网上找到太多信息。

这些功能有什么区别?他们每个人的适当用例是什么?

【问题讨论】:

    标签: core-data


    【解决方案1】:

    这里的文档有点糟糕,但您可以通过查看函数接收的参数来获得部分解释。

    • resolve(optimisticLockingConflicts list: [NSMergeConflict]):获取一个或多个NSMergeConflict 的列表。当同一个底层实例在多个托管对象上下文上被修改时,这就是您通常会听到的合并冲突。
    • resolve(constraintConflicts list: [NSConstraintConflict]):获取一个或多个NSConstraintConflict 的列表。如果您对实体有唯一性约束,但您尝试插入具有重复值的实例,则会发生这种情况。

    奇怪的是resolve(mergeConflicts list: [Any])。这基本上是唯一性约束存在之前的遗留物。它会为上述两种类型的冲突调用——但前提是你不实现更具体的功能。例如,如果你有一个约束冲突,resolve(constraintConflicts:...) 如果你实现了它就会被调用。如果您没有实现它,上下文会尝试使用resolve(mergeConflicts list: [Any])。相同的过程适用于合并冲突——上下文使用一个函数(如果存在),并且可以回退到另一个函数。不要实现这个功能,使用其他两个之一。

    对于这两种冲突类型,参数都会为您提供有关冲突的详细信息,包括存在冲突的对象和冲突的详细信息。你可以随心所欲地解决它们。

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 2019-12-16
      • 2020-05-15
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2016-06-01
      相关资源
      最近更新 更多