2016-05-05 26 views
4

我的问题与在“WWDC 2014 Advanced CloudKit”中命名的“Delta Download”相关。CloudKit:CKFetchRecordChangesOperation,CKServerChangeToken和Delta Download

我正在尝试为我的Core Data应用程序进行同步,这是目前仅有的iPhone(请考虑:只有一个设备处于活动状态)。因此,基本上应用程序会将用户记录存储在同一台设备的云中,目前大多数情况下都是如此。

我无法理解基于CKFetchRecordChangesOperation或Delta下载的自定义区域功能。

正如我所知道的那样,我们有CKServerChangeToken来维护同步操作(我的意思是只下载那些由另一个设备添加/修改/删除的记录),就像在WWDC上展示的那样。 但是,我不明白的是,我们仅在CKFetchRecordChangesOperation后收到该令牌,当我们将记录保存到云中时,我们没有获得新的令牌。

如果我们使用当前可用的令牌进行提取(因为它只在提取后才改变),我们会收到从我们以前的保存操作中保存的记录。基本上,我们可以保存我们设备上已有的记录。为什么?我在这里错过了什么?

如果我们向云(从设备A)播种一些数据,那么设备B获取区记录时的情况是正确的,但如果设备A是?再次下载所有记录?

我发现recordChangeTagCKRecord,这是我可以用解决与本地对象冲突的属性 - 获取对象(相同或不同的版本),如果这样能有人给我举例我是如何做到这一点:保存recordChangeTag首次将记录保存到CloudKit时的核心数据还是如何?

缺乏文档是如此头疼。

+1

我实际上已经与Apple就这个问题开了一个支持案例。使用'CKFetchRecordChangesOperation'告诉设备的变化是没有意义的。我被坦率地告知 - 事情就是这样。因此,您的代码需要处理所有这些冗余记录更改。 – rmaddy

+0

@rmaddy哦,谢谢你的信息。如果你把它写成答案,我会接受它,因为没有其他答案,你是最接近的答案。 –

+0

@rmaddy我读过你对苹果devforum Rick的讨论,我想问你,你是否尝试了PIK建议的解决方法?链接讨论:https://forums.developer.apple.com/message/77233#77233 –

回答

3

我找到了一个时间来为这个问题写一个答案。我不会深入实施,但我会讨论这个概念。

CloudKit为您的设备和CloudKit服务器之间的数据同步提供了一种方法。 我只用iPhone和服务器建立同步过程(同样,如果您有iPhone + iPad应用程序,则需要更多步骤。):

我在私有云数据库中有自定义区域。 我使用OperationQueue来建立不同的依赖于彼此的异步过程。一些操作有自己的操作队列。

步骤:

1)检查我的自定义区域是存在

1.1)如果没有自定义区域

1.2)创建新的自定义区域。 (可选:添加记录)

1.3)刷新区更改令牌

您可以通过刷新区更改令牌:使用的NSKeyedArchiver执行 CKFetchRecordChangesOperationfetchRecordChangesCompletionBlock回报CKServerChangeToken 保存到UserDefaults(例如)) 。此操作的任务是刷新令牌,并在结束同步过程中执行该令牌。

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/

你会发现有实施和设计理念。值得一读。我希望有人会发现这一切都很有帮助。

+0

感谢您花时间写这篇文章!它帮助我解决同样的问题。 Apple的WWDC视频和文档没有澄清或警告此问题。他们将CloudKit作为上帝发送框架销售,但有太多死路一条和陷阱。 – lostAtSeaJoshua

+0

如果使用CoreData作为本地存储,解决此问题的另一个建议是可以为CKFetchRecordChangesOperation发送所有已更改的记录。然后根据比较“recordChangeTag”过滤出记录,因此即使相同的记录正在返回,它们也会被过滤掉并继续处理实际更改。 – lostAtSeaJoshua

+0

@lostAtSeaJoshua你是对的,CloudKit工具包有很好的机会,但是缺乏关于某些主题的文档,比如Core Data与iCloud同步......(现在是,但现在没关系)。关于过滤,是的,你需要对记录进行某种验证。但是,正如我所见,'CKFetchRecordChangesOperation'已被弃用... https://developer.apple.com/reference/cloudkit/ckfetchrecordchangesoperation –