cloudkit – CKFetchDatabaseChangesOperation不返回记录区域ID

我在我的应用程序中使用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)

我正在设置fetch的私有数据库中有记录,但我只得到changeTokenUpdatedBlock和fetchDatabaseChangesCompletion.

我是否正确地说当我运行此操作并且我的私有数据库的默认区域被传入此块时,我应该期望看到recordZoneWithIDChangedBlock被命中?

这意味着当我调用我的fetchDatabaseChangesCompletion时,没有什么可以提取的,因为记录区域ID的数组是空的:(注意,错误是nil)

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)
}

最佳答案 我遇到了同样的问题,这是由于CKFetchDatabaseChangesOperation和CKFetchRecordZoneChangesOperation仅适用于自定义区域. CloudKit确实希望开发人员对数据进行划分,以便他们在自定义区域中支持更多功能.

The disadvantage of using the default zone for storing records is that it does not have any special capabilities. You cannot save a group of records to iCloud atomically in the default zone. Similarly, you cannot use a CKFetchRecordChangesOperation object on records in the default zone.

CKRecordZone default() Reference

CKFetchRecordChangesOperation在iOS 10中已弃用,并替换为CKFetchRecordZoneChangesOperation.

点赞