官方文档是否谈论有关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);
有没有办法强制强烈一致的读取,以反映所有以前的更新?
答案 0 :(得分:7)
两者兼而有之:如果您按标识符获取记录,CloudKit会非常一致,但是当您使用查询获取记录时,CloudKit会保持一致。
当CKModifyRecordsOperation
成功返回时,记录可以通过其标识符立即获取。
但是,服务器扫描记录的值并更新和分发其搜索索引需要一些时间。在索引完成之前,您无法在任何查询中看到记录。
答案 1 :(得分:0)
我对术语“最终一致性”的唯一体验是使用CouchDB,这最终是一致的。 CloudKit与CouchDB非常不同,因为CouchDB允许复制分布式数据库,而CloudKit仅提供“用于管理与iCloud服务器之间的数据传输的服务” - 它只是一种传输机制。
我很确定传输机制本身并不是最终一致的 - 它直接从CloudKit服务器保存和检索。
由于CloudKit只是一种传输机制,因此您负责维护自己的本地缓存/数据库。您的本地数据库将被视为最终一致,因为它在同步之间不一定一致,并且只有在您最终使用CloudKit同步它时才会变得一致。
现在,您说在测试中您正在保存,然后尝试检索记录。但是我在你的代码中注意到你没有在保存操作中检查错误。那么,在保存过程中可能存在错误,您错过了?