1

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

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

我也调用了fetchZoneChanges(database: database, databaseTokenKey: databaseTokenKey, zoneIDs: changedZoneIDs, completionchangesOperation.fetchDatabaseChangesCompletionBlock方法fetchDatabaseChanges

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

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

哪个是最好的方法?

斯威夫特 3,Xcode 9

4

1 回答 1

2

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

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

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

于 2018-09-07T12:26:29.787 回答