在我的应用程序中,我使用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} }值。
这是正确的技术吗?还是最好在ckDatabaseToken
和fetchDatabaseChanges
方法中只使用一个变量来存储fetchZoneChanges
的值?
哪种方法最好?
Swift 3,Xcode 9
答案 0 :(得分:1)
我已经尝试了两种方法,并且发现如果在用户默认值中使用一个changeToken,则会收到“错误同步继续数据”错误。
当我使用2个单独的值来存储数据库更改和区域更改时,我没有任何错误。
所以,我认为我们必须分别在CKDatabase和CKRecordZone中缓存一个CKServerChangeToken。