官方文档是否在某处讨论有关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);
有没有办法强制强烈一致的读取,以反映所有以前的更新?
它只是两者兼而有之:如果您通过标识符获取记录,CloudKit是非常一致的,但是当您使用查询获取记录时,CloudKit最终是一致的.
当a CKModifyRecordsOperation
成功返回时,记录可以通过其标识符立即获取.
但是,服务器扫描记录的值并更新和分发其搜索索引需要一些时间.在索引完成之前,您将无法在任何查询中看到记录.