5

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

我正在为其设置提取的私有数据库中有记录,但我只得到changeTokenUpdatedBlockfetchDatabaseChangesCompletion.

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

这意味着当我调用 my 时fetchDatabaseChangesCompletion,没有什么可获取的,因为记录区域 ID 的数组为空:(注意,error为 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)
}
4

1 回答 1

3

I ran into this same problem and it is due to CKFetchDatabaseChangesOperation and CKFetchRecordZoneChangesOperation only working on custom zones. CloudKit really wants developers to compartmentalize data so they support more capabilities in custom zones.

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 was deprecated in iOS 10 and replaced with CKFetchRecordZoneChangesOperation.

于 2017-03-08T15:45:16.440 回答