我们应该在 CKDatabase 和 CKRecordZone 中分别缓存一个 CKServerChangeToken 吗?

Posted

技术标签:

【中文标题】我们应该在 CKDatabase 和 CKRecordZone 中分别缓存一个 CKServerChangeToken 吗?【英文标题】:Should we cache a CKServerChangeToken in CKDatabase and CKRecordZone separately? 【发布时间】:2018-09-05 23:25:14 【问题描述】:

在我的应用程序中,我使用 CloudKit 和用户的私有 CKDatabase 来存储记录。当应用程序启动时,我会按照 WWDC 2016 的建议获取更改。

首先,我调用fetchDatabaseChanges(database: CKDatabase, databaseTokenKey: String, completion: @escaping () -> Void) 方法。 在changesOperation.fetchDatabaseChangesCompletionBlock 的这个方法中,我将 CKServerChangeToken 保存到 userDefaults 以获取密钥:ckDatabaseToken

我还在fetchDatabaseChanges方法的changesOperation.fetchDatabaseChangesCompletionBlock中调用fetchZoneChanges(database: database, databaseTokenKey: databaseTokenKey, zoneIDs: changedZoneIDs, completion

fetchZoneChanges 方法中有一个operation.recordZoneFetchCompletionBlock。在这个块中,我们还需要将令牌的值保存到 UserDefaults。我将它保存到用户默认值中的另一个 ckZoneToken 变量中。所以在fetchZoneChanges 中,我获取并保存(从/到UserDefaults)ckZoneToken 值,在fetchDatabaseChanges 中,我获取并保存(从/到UserDefaults)ckDatabaseToken 值。

这是正确的技术吗?或者最好只使用fetchDatabaseChangesfetchZoneChanges 方法中的一个变量来存储CKServerChangeToken 的值?

哪种方法最好?

斯威夫特 3,Xcode 9

【问题讨论】:

【参考方案1】:

我对这两种方法都进行了试验,发现如果我们在用户默认值中使用一个 changeToken,我们会收到“Bad sync continuation data”错误。

当我使用 2 个单独的值来存储数据库更改和区域更改时,我没有出错。

所以,我认为我们必须分别在 CKDatabase 和 CKRecordZone 中缓存一个 CKServerChangeToken。

【讨论】:

以上是关于我们应该在 CKDatabase 和 CKRecordZone 中分别缓存一个 CKServerChangeToken 吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 NSTreeNode 作为 CKRecordValueStore 存储到 cloudkit

CloudKit 是强一致还是最终一致?

如何对 CloudKit/Core Data 进行单元测试?

CloudKit 操作在开发版本中执行,但有时在生产版本中挂起

无法使用 Swift 获取 userCKRecordID

使用 bitnami wapp 时我们应该在哪里保存我们的 html 和 php 文件?