Swift:实现自定义合并策略

Posted

技术标签:

【中文标题】Swift:实现自定义合并策略【英文标题】:Swift: Implementing custom merge policy 【发布时间】:2020-06-19 07:33:37 【问题描述】:

我正在使用 Swift 构建一个 OSX 应用程序,并将 Coredata 作为我的数据层。作为其中的一部分,我有一个表格,其中列出了大量文件,以及与每个文件相关联的元数据。每条记录都可以包含一个 URI,该 URI 指向可以托管它的三个服务之一。

1. title   created_at   size   uuid   source_local   source_remote   source_cloud

我使用从本地来源提取的信息生成所有记录。这些记录都有一个source_local 字符串。

稍后我从远程源导入了一些记录。这些记录都被添加并有一个source_remote 字符串。

其中许多记录都托管在这两种服务上,并且具有匹配的 UUID。 UUID 字段有唯一约束,我希望 Swift 在出现约束错误时以某种方式合并这两个记录的字段。

我试过了:

NSMergeByPropertyStoreTrumpMergePolicyNSMergeByPropertyObjectTrumpMergePolicy

但这些政策导致一个记录完全胜过另一个记录。

目前我必须通过检查是否已存在具有 UUID 的记录并使用新文件中的任何缺失字段更新现有记录来解决此限制。

然而这感觉并不理想——有没有办法创建自定义合并策略,以便让 Swift 以这种方式自动处理冲突?在这个阶段,我不关心 Store 或 Memory 记录是否胜过另一个,只要我能正确合并 source_* 字段即可。

谢谢

【问题讨论】:

您可以继承NSMergePolicy 并为其编写自己的代码。我从来没有做过,所以我不会写一个答案,但这就是你要开始的地方。 Florian Kugler 和 Daniel Eggert 的优秀书籍 Core Data 提供了如何实现自定义合并策略的示例。相关代码可以在here找到。 【参考方案1】:

首先,感谢@tom-harrington 对扩展 NSMergePolicy 的认可。我什至没有考虑走这条路,这是我的巨大疏忽。

在探索如何实现 NSMergeByPropertyStoreTrumpMergePolicy/NSMergeByPropertyObjectTrumpMergePolicy 时,我意识到这个问题源于我的误解。这些政策已经在财产层面处理了冲突。他们不会在发生冲突时丢弃整个对象状态之一,而是比较每个属性并仅将策略应用于已更改/存在的那些属性。

NSOverwriteMergePolicy 和 NSRollbackMergePolicy 是会导致对象 A 或 B 中的一个在发生冲突时被完全丢弃的策略。

【讨论】:

以上是关于Swift:实现自定义合并策略的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如果数组的自定义对象元素具有相同的键,则合并它们

swift使用AVFoundation实现自定义相机

ABAP采购申请自定义审批策略的实现

ABAP采购申请自定义审批策略的实现

Spring 实现策略模式--自定义注解方式解耦if...else

Swift 自定义工具栏实现