7

官方文档是否在某处谈论 CloudKit 一致性?根据我的测试,它似乎最终是一致的——在写入后立即读取记录可能有效,也可能无效(返回空结果):

CKDatabase *database = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Foo"];

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) {
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Foo" predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]];
    [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
        XCTAssertEqualObjects(results, @[], @"Freshly written object not returned by query."); // succeeds
        dispatch_semaphore_signal(semaphore);
    }];
}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

有没有办法强制进行反映所有先前更新的强一致读取?

4

2 回答 2

9

两者兼而有之:如果您通过标识符获取记录,CloudKit 是强一致的,但当您通过查询获取记录时最终是一致的。

当 aCKModifyRecordsOperation成功返回时,该记录可立即通过其标识符获取。

但是,服务器扫描记录的值并更新和分发其搜索索引需要一些时间。在索引完成之前,您不会在任何查询中看到记录。

于 2015-02-21T01:57:17.453 回答
0

我对“最终一致性”一词的唯一经验是使用 CouchDB,它最终是一致的。CloudKit 与 CouchDB 的不同之处在于,CouchDB 允许复制分布式数据库,而 CloudKit 仅提供“用于管理与 iCloud 服务器之间的数据传输的服务”——它只是一种传输机制。

我很确定传输机制本身最终并不一致——它直接从 CloudKit 服务器保存和检索。

由于 CloudKit 只是一种传输机制,因此您负责维护自己的本地缓存/数据库。您的本地数据库将被认为是最终一致的,因为它在同步之间不一定是一致的,并且只有在您最终使用 CloudKit 同步它时才会变得一致。

现在,您说在您的测试中您正在保存然后尝试检索记录。但是我在您的代码中注意到您没有检查保存操作中的错误。那么,也许在您丢失的保存过程中出现错误?

于 2014-11-20T15:32:38.443 回答