Swift:实施自定义合并策略

时间:2020-06-19 07:33:37

标签: swift database core-data merge

我正在使用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以这种方式自动处理冲突?在此阶段,只要我可以正确合并source_*字段,我就不必担心存储记录还是存储记录是否胜过其他记录。

谢谢

1 个答案:

答案 0 :(得分:0)

首先,感谢@ tom-harrington对扩展NSMergePolicy的点头。在我这方面,我什至没有考虑过走这条路。

在探索如何实现NSMergeByPropertyStoreTrumpMergePolicy / NSMergeByPropertyObjectTrumpMergePolicy的同时,我意识到这个问题源于我的误解。这些策略已在属性级别处理冲突。他们不会比较冲突中的所有对象状态,而是比较每个属性,仅将策略应用于已更改/存在的那些属性。

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