我们应该在 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
值。
这是正确的技术吗?或者最好只使用fetchDatabaseChanges
和fetchZoneChanges
方法中的一个变量来存储CKServerChangeToken
的值?
哪种方法最好?
斯威夫特 3,Xcode 9
【问题讨论】:
【参考方案1】:我对这两种方法都进行了试验,发现如果我们在用户默认值中使用一个 changeToken,我们会收到“Bad sync continuation data”错误。
当我使用 2 个单独的值来存储数据库更改和区域更改时,我没有出错。
所以,我认为我们必须分别在 CKDatabase 和 CKRecordZone 中缓存一个 CKServerChangeToken。
【讨论】:
以上是关于我们应该在 CKDatabase 和 CKRecordZone 中分别缓存一个 CKServerChangeToken 吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 NSTreeNode 作为 CKRecordValueStore 存储到 cloudkit
如何对 CloudKit/Core Data 进行单元测试?