Dim*_*lov 6 synchronization nsoperation ios icloud cloudkit
我的问题与 WWDC 2014 Advanced CloudKit 中命名的“Delta Download”有关。
我正在尝试为我的 Core Data 应用程序进行同步,该应用程序目前仅适用于 iPhone(想想:只有一台设备处于活动状态)。因此,对于目前的大多数情况,基本上该应用程序会将来自同一设备的用户记录存储在云中。
我无法理解基于CKFetchRecordChangesOperationDelta 下载的自定义区域功能。
正如我做对的那样,我们必须CKServerChangeToken维护同步操作(我的意思是只下载那些被其他设备添加/修改/删除的记录),正如 WWDC 上所展示的那样。但是,我无法理解的是,我们只有在 之后才会收到该令牌CKFetchRecordChangesOperation,当我们将记录保存到云端时,我们不会获得新的令牌。
如果我们使用当前可用的令牌进行 fetch(因为它只在 fetch 之后改变),我们会收到从我们之前的保存操作中保存的记录。基本上,我们会获得设备上已有的保存记录。为什么?我在这里遗漏了什么?
如果我们将一些数据播种到云端(从设备 A),设备 B 正在获取区域记录的情况是合理的,但如果设备 A 是?重新下载所有记录?
我recordChangeTag在CKRecord,这是一个属性,我可以用来解决与本地对象的冲突 - 获取的对象(相同或不同的版本),如果是这样,有人可以举出我需要如何执行此操作的示例:保存时将 recordChangeTag 保存到核心数据第一次录制到 CloudKit 还是如何录制?
缺乏文档是一件令人头疼的事。
我找了个时间来写一下这个问题的答案。我不会深入探讨实现,但我会讨论这个概念。
CloudKit 提供了一种在您的设备和 CloudKit 服务器之间进行数据同步的方法。在我的案例中,我仅在 iPhone 和服务器之间建立同步过程(同样,如果您有 iPhone + iPad 应用程序,该过程需要更多步骤。):
我在私有云数据库中有自定义区域。我使用OperationQueue建立不同的相互依赖的异步进程。一些操作有自己的操作队列。
脚步:
1)检查我的自定义区域是否存在
1.1) 如果没有自定义区域
1.2) 创建新的自定义区域。(可选:添加记录)
1.3) 刷新区域更改令牌
您可以通过以下方式刷新区域更改令牌:执行
CKFetchRecordChangesOperation,fetchRecordChangesCompletionBlock返回 将CKServerChangeToken其保存到 UserDefaults(例如,使用 NSKeyedArchiver)。此操作的任务是刷新令牌,它在同步过程结束时执行。
2) 如果已有自定义区域
2.1) 使用之前保存的区域更改令牌从区域获取更改。( CKFetchRecordChangesOperation)
2.2)更新和删除本地记录。
2.3) 刷新区域更改令牌。
2.4)检查本地更改(我使用上次云同步时间戳来检查之后修改了哪些记录)。
2.5)上传记录到云套件数据库
2.6) 再次刷新区域更改令牌。
我强烈推荐尼克·哈里斯文章系列:https://nickharris.wordpress.com/2016/02/09/cloudkit-core-data-nsoperations-introduction/
您会在那里找到实现和设计概念。值得一读。我希望有人会发现所有这些都有帮助。
| 归档时间: |
|
| 查看次数: |
1130 次 |
| 最近记录: |