cloudKit:公共数据库中的 CKFetchRecordChangesOperation

Posted

技术标签:

【中文标题】cloudKit:公共数据库中的 CKFetchRecordChangesOperation【英文标题】:cloudKit: CKFetchRecordChangesOperation in public database 【发布时间】:2015-05-22 10:46:15 【问题描述】:

我使用 cloudKit 构建了一个 ios 应用程序。我正在尝试批量获取 cloudKit 中的数据,以获取设备和 cloudKit 之间的增量,但似乎 CKFetchRecordChangesOperation 在公共数据库中不起作用。我唯一的选择是 CKQuery 来获取我的数据吗?例如:

 CKContainer *container = [CKContainer containerWithIdentifier:containerID];
    CKDatabase *publicDatabase = [container publicCloudDatabase];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:recordType
                                               predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]];
     CKQueryOperation *queryOp = [[CKQueryOperation alloc] initWithQuery:query];
    queryOp.desiredKeys = @[@"record.recordID.recordName"];
    queryOp.recordFetchedBlock = ^(CKRecord *record)
    
        // do something...
    ;

     queryOp.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error)
    
        // do something else...
    ;

    queryOp.resultsLimit = CKQueryOperationMaximumResults;
    [publicDatabase addOperation:queryOp];

非常感谢您的帮助。

【问题讨论】:

如果我很好理解 CKFetchRecordChangesOperation 将只在自定义区域的私有数据库中工作。 CKFetchNotificationChangesOperation 也适用于公共数据库。 @János 你能发个例子吗? 这里分享了代码如何使用CKFetchNotificationChangesOperation:***.com/questions/30213261/… @János 你有 Objective-C 版本吗? 【参考方案1】:

CKFetchRecordChangesOperation 的苹果文档说明:

recordZoneID :包含您要获取的记录的区域。该区域可以是 自定义区域。不支持同步默认区域。

这意味着它不能在公共数据库上运行,因为它只支持默认区域。

实现相同功能的正确方法是为您需要的数据创建订阅并使用 CKFetchNotificationChangesOperation 检索该数据。当然你也可以只执行一些 CKQuery 命令,但是你可能会经常获取数据或执行你不需要的查询。

【讨论】:

请注意,OS X 版本的 XCode 6.4 中的类文档中缺少最后一句。 CKFetchNotificationChanges 对 OP 没用,因为它不是每个设备,而是每个帐户。

以上是关于cloudKit:公共数据库中的 CKFetchRecordChangesOperation的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 从 Cloudkit 公共数据库中获取所有记录

可以使用 Realm 作为持久模型来表示 CloudKit 公共数据库吗?

CloudKit:免费的公共存储和数据传输

Cloudkit 公共数据库错误:“不允许写入操作”

CloudKit 无法从公共容器中获取数据。错误 1/4000

为啥 CloudKit 不允许我将任何记录保存到默认容器的公共数据库中?