Sprechen die offiziellen Dokumente irgendwo über die Konsistenz von CloudKit? Nach meinen Tests scheint es schließlich, konsequent zu sein - eine Aufzeichnung sofort nach dem Lesen des Schreiben es funktionieren könnte und möglicherweise nicht (leer Ergebnisse Rückkehr):Ist CloudKit stark konsistent oder sogar konsistent?
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);
Gibt es eine Möglichkeit, eine stark konsistente Lese zu zwingen, die alle widerspiegeln würde vorherige Updates?
Ich merke das gleiche in meinen Tests. Ich speichere eine Aufzeichnung und warte darauf, dass sie erfolgreich abgeschlossen wird. Wenn ich dann eine Abfrage für alle Datensätze durchführe, wird mein neuer Datensatz nicht zurückgegeben. Haben Sie Informationen darüber gefunden, dass CloudKit letztendlich konsistent ist? –
Mein Anwendungsfall war glücklicherweise sehr einfach, also löste ich das Problem mit einer Art Cache im Datenspeicher-Layer: Wenn ein Objekt in den Datenspeicher eingefügt wird, wird es für kurze Zeit in iCloud _and_ auf dem Client gespeichert. Und wenn der Datenspeicher-Layer abgefragt wird, fügt er die lebenden Cache-Datensätze zur Ergebnismenge hinzu. Dumm, aber funktioniert. – zoul
@zoul jemals einen besseren Weg finden, damit umzugehen? Der letzte Teil des Inline-Kommentars in CKModifyRecordsOperation.h für modifyRecordsCompletionBlock schlägt vor, dass dies das entworfene Verhalten ist: "** Dieser Aufruf erfolgt, sobald der Server alle Datensatzänderungen gesehen hat und möglicherweise aufgerufen wird, während der Server die Seite verarbeitet Auswirkungen dieser Änderungen. ** " – George