我正在使用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以这种方式自动处理冲突?在此阶段,只要我可以正确合并source_*
字段,我就不必担心存储记录还是存储记录是否胜过其他记录。
谢谢
答案 0 :(得分:0)
首先,感谢@ tom-harrington对扩展NSMergePolicy的点头。在我这方面,我什至没有考虑过走这条路。
在探索如何实现NSMergeByPropertyStoreTrumpMergePolicy / NSMergeByPropertyObjectTrumpMergePolicy的同时,我意识到这个问题源于我的误解。这些策略已在属性级别处理冲突。他们不会比较冲突中的所有对象状态,而是比较每个属性,仅将策略应用于已更改/存在的那些属性。
NSOverwriteMergePolicy和NSRollbackMergePolicy是会导致对象A或对象B之一在冲突时被完全丢弃的策略。