在我的应用程序中,我使用CloudKit和用户的私有CKDatabase来存储记录。当该应用程序在2016年WWDC上建议启动时,我会获取修改信息。
首先,我调用fetchDatabaseChanges(database: CKDatabase, databaseTokenKey: String, completion: @escaping () -> Void)方法。在changesOperation.fetchDatabaseChangesCompletionBlock中的这个方法中,我将一个CKServerChangeToken保存到userDefaults中,以获得一个键:ckDatabaseToken。
我还在fetchZoneChanges(database: database, databaseTokenKey: databaseTokenKey, zoneIDs: changedZoneIDs, completion方法的changesOperation.fetchDatabaseChangesCompletionBlock中调用fetchDatabaseChanges。
在fetchZoneChanges方法中有一个operation.recordZoneFetchCompletionBlock。在这个块中,我们还需要将令牌的值保存到UserDefaults。我将它保存到另一个ckZoneToken变量中,在用户默认情况下。因此,在fetchZoneChanges中,我获取并保存(从/到UserDefaults) ckZoneToken值,而在fetchDatabaseChanges中,我获取并保存(从/到UserDefaults) ckDatabaseToken值。
是正确的技术吗?还是最好只使用fetchDatabaseChanges和fetchZoneChanges方法is中的一个变量来存储CKServerChangeToken的值?
哪一种是最好的方法?
Swift 3,Xcode 9
发布于 2018-09-07 12:26:29
我对这两种方法都进行了实验,并发现如果我们在用户默认情况下使用one changeToken,我们就会得到一个“坏的同步延续数据”错误。
当我使用两个单独的值来存储数据库更改和区域更改时,我没有出现错误。
因此,我认为我们必须将CKServerChangeToken分别缓存在CKDatabase和CKRecordZone中。
https://stackoverflow.com/questions/52194577
复制相似问题