我们是否应该在CKDatabase和CKRecordZone中分别缓存CKServerChangeToken?

时间:2018-09-05 23:25:15

标签: swift cloudkit ckrecord ckrecordzone

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

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

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

fetchZoneChanges方法中有一个operation.recordZoneFetchCompletionBlock。在此块中,我们还需要将令牌的值保存到UserDefaults。然后将其保存到“用户默认设置”中的另一个ckZoneToken变量中。因此,在fetchZoneChanges中,我获取并保存(从/到UserDefaults)ckZoneToken值;在fetchDatabaseChanges中,我获取并保存(从/到UserDefaults){{1} }值。

这是正确的技术吗?还是最好在ckDatabaseTokenfetchDatabaseChanges方法中只使用一个变量来存储fetchZoneChanges的值?

哪种方法最好?

Swift 3,Xcode 9

1 个答案:

答案 0 :(得分:1)

我已经尝试了两种方法,并且发现如果在用户默认值中使用一个changeToken,则会收到“错误同步继续数据”错误。

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

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