CloudKit是强烈一致的,还是最终一致的?

时间:2014-06-11 06:51:27

标签: eventual-consistency cloudkit

官方文档是否谈论有关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);

有没有办法强制强烈一致的读取,以反映所有以前的更新?

2 个答案:

答案 0 :(得分:7)

两者兼而有之:如果您按标识符获取记录,CloudKit会非常一致,但是当您使用查询获取记录时,CloudKit会保持一致。

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

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

答案 1 :(得分:0)

我对术语“最终一致性”的唯一体验是使用CouchDB,这最终是一致的。 CloudKit与CouchDB非常不同,因为CouchDB允许复制分布式数据库,而CloudKit仅提供“用于管理与iCloud服务器之间的数据传输的服务” - 它只是一种传输机制。

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

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

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