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 在出现约束错误时以某种方式合并这两个记录的字段。
我试过了:
NSMergeByPropertyStoreTrumpMergePolicy
和
NSMergeByPropertyObjectTrumpMergePolicy
但这些政策导致一个记录完全胜过另一个记录。
目前我必须通过检查是否已存在具有 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:如果数组的自定义对象元素具有相同的键,则合并它们