【发布时间】:2021-05-28 12:21:34
【问题描述】:
以下是 Apple 的 doc 中将 Core Data 与 Cloudkit 一起使用的要求之一:
所有关系都必须是可选的。由于操作规模的限制, 关系更改可能不会自动保存。
尝试使用与 CloudKit 的可选关系会导致错误:
线程 1:致命错误:未解决的错误 Error Domain=NSCocoaErrorDomain Code=134060 “发生核心数据错误。” UserInfo={NSLocalizedFailureReason=CloudKit 集成要求所有关系都是可选的,以下不是: Some_Managed_Object: some_attribute}, ["NSLocalizedFailureReason": CloudKit 集成要求所有关系都是可选的,以下不是: Some_Managed_Object: some_attribute]
我想知道,这不是完全违背了使用关系的目的吗?
例如,假设我有两个实体:Account 和 Transfer。由于转账始终与源账户和目标账户相关联,Transfer 应该与Account 有两个非可选关系。但由于上述要求,这些关系必须是可选的。
文档给出了解释:“(这是因为)关系更改可能无法自动保存”。这似乎表明,在 Cloudkit 和 Core Data 之间同步期间,关系可能是不完整的并且不完整的关系会暴露给 App 代码。这对我来说似乎是一个严重的问题,因为:
-
在我上面的例子中,这两个关系本质上是非可选的。将它们更改为可选会使模态变得毫无意义。
-
即使在那些关系应该是可选的示例中,虽然不完整的关系在语法上是正确的,但它可能会导致意外的不一致问题。
所以我想知道这应该如何在实际应用中工作?这对我来说似乎很破碎。我是不是误会了什么? 难道使用 Cloudkit 同步 Core Data 只适用于一小部分只使用可选关系的应用程序?(如果是这样,我想知道其他 Core Data 应用程序是如何在设备之间同步数据的。 )
在相关说明中:像许多其他人一样,我努力搜索有关 Cloudkit 和 Core Data 使用的同步和冲突解决算法的详细信息。我能找到的仅有的几条信息是:
在最终一致的分布式系统中,您永远无法“知道” 您在云中拥有现有数据或设备。你的申请 将简单地“在某个时候发现”这些数据存在并且需要 旨在处理该问题
是的,Core Data CloudKit 使用 CRDT 实现了对多关系!
冲突解决由自动执行 使用最后一个写入器的 NSPersistentCloudKitContainer 赢得合并策略。
虽然我大致了解这些信息中的每一条,但它们并没有直接得出以下结论:1) Cloudkit 和 Core Data 之间的数据更改是否以原子方式同步?更重要的是 2) 在同步期间是否会将不完整的数据暴露给 App 代码?
我的猜测是 1) 不,2) 是。但是,如果在同步期间不完整的数据更改暴露给 App 代码,我很难理解如何编写真正的应用程序。 难道要使用 Cloudkit 来同步 Core Data,必须将模式设计为在不完整的关系下正常工作?
如果有人能分享你的理解,我将不胜感激。
【问题讨论】: