cloudkit - CKFetchDatabaseChangesOperation 不返回记录区域 ID

标签 cloudkit ckfetchrecordchangesopera

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

我正在为其设置提取的私有(private)数据库中的记录,但我只能获取 changeTokenUpdatedBlockfetchDatabaseChangesCompletion

我是否正确地说,当我运行此操作时,我应该看到 recordZoneWithIDChangedBlock 被命中,并且我的私有(private)数据库的默认区域将传递到此 block ?

这意味着当我调用 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)
}

最佳答案

我遇到了同样的问题,这是由于 CKFetchDatabaseChangesOperationCKFetchRecordZoneChangesOperation 仅适用于自定义区域。 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

关于cloudkit - CKFetchDatabaseChangesOperation 不返回记录区域 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655875/

相关文章:

swift - 使用 swift 检查 CloudKit 中是否存在具有指定值的记录

ios - 如何使用 cloudkit 查询获取 Assets 名称

swift - 服务器记录中的 CKAsset 不包含 fileURL,甚至无法检查 nil

ios - CKFetchRecordChangesOperation首先返回垃圾数据

ios - 更新通知的替代方法不起作用

CloudKit:删除记录的 CKQueryOperation

ios - 无法查询用户 CKRecords

ios - 不下载数据获取CKAsset URL