我在我的应用程序中使用CloudKit并开始遵循WWDC视频“CloudKit最佳实践”中的最佳实践
要做的第一件事就是检查我喜欢的变化,
let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
changesOperation.fetchAllChanges = true
changesOperation.recordZoneWithIDChangedBlock = { self.recordZoneWithIDChanged($0) }
changesOperation.recordZoneWithIDWasDeletedBlock = { self.recordZoneWithIDWasDeleted($0) }
changesOperation.changeTokenUpdatedBlock = { self.changeTokenUpdate($0) }
changesOperation.fetchDatabaseChangesCompletionBlock = { self.fetchDatabaseChangesCompletion($0, isMoreComing: $1, error: $2) }
privateDatabase.add(changesOperation)
私人数据库中有我正在设置抓取的记录,但我只得到changeTokenUpdatedBlock
和fetchDatabaseChangesCompletion
。
我是否正确地说当我运行此操作并且我的私有数据库的默认区域被传入此块时,我应该期望看到recordZoneWithIDChangedBlock
被击中?
这意味着当我调用fetchDatabaseChangesCompletion
时,由于记录区域ID数组为空,因此无需提取任何内容:(注意,error
为零)
fileprivate func fetchDatabaseChangesCompletion(_ newToken: CKServerChangeToken?, isMoreComing: Bool, error: Error?)
{
if let error = error
{
// Handle error
return
}
let fetchZoneChangesOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedRecordZoneIDs,
optionsByRecordZoneID: nil)
fetchZoneChangesOperation.recordChangedBlock = { self.recordChanged($0) }
fetchZoneChangesOperation.recordWithIDWasDeletedBlock = { self.recordWithIDWasDeleted($0, string: $1) }
fetchZoneChangesOperation.recordZoneFetchCompletionBlock = { self.recordZoneFetchCompletion($0, newChangeToken: $1, clientSentChangeTokenData: $2, isMoreComing: $3, error: $4) }
fetchZoneChangesOperation.completionBlock = { self.fetchRecordZoneChangesCompletion() }
privateDatabase.add(fetchZoneChangesOperation)
}
答案 0 :(得分:1)
我遇到了同样的问题,原因是CKFetchDatabaseChangesOperation
和CKFetchRecordZoneChangesOperation
仅适用于自定义区域。 CloudKit确实希望开发人员划分数据,以便他们在自定义区域中支持更多功能。
使用默认区域存储记录的缺点是它没有任何特殊功能。您无法在默认区域中以原子方式将一组记录保存到iCloud。同样,您不能在默认区域中的记录上使用CKFetchRecordChangesOperation对象。
CKRecordZone default()
Reference
CKFetchRecordChangesOperation
在iOS 10中已弃用,已替换为CKFetchRecordZoneChangesOperation
。