I documenti ufficiali parlano della coerenza di CloudKit? Secondo le mie prove sembra essere finalmente coerente - la lettura di un disco subito dopo la scrittura potrebbe funzionare e non potrebbe (di restituire i risultati vuoto):CloudKit è fortemente coerente o coerente?
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);
C'è un modo per forzare una lettura fortemente coerente che riflettesse tutto aggiornamenti precedenti?
Sto notando la stessa cosa nei miei test. Sto salvando un record e aspetto che si completi con successo. Se poi eseguo una query per tutti i record, il mio nuovo record non viene restituito. Hai trovato qualche informazione affermando che CloudKit è alla fine coerente? –
Il mio caso d'uso era fortunatamente molto semplice, quindi ho "risolto" il problema con una sorta di cache nel livello del datastore: quando un elemento viene inserito nell'archivio dati, viene scritto su iCloud _e_ memorizzato sul client per un breve periodo. E quando il livello del datastore viene interrogato, aggiunge i record della cache vivente al set di risultati. Stupido, ma funziona. – zoul
@zoul mai trovato un modo migliore per gestire questo? L'ultima parte del commento in linea in CKModifyRecordsOperation.h per modifyRecordsCompletionBlock suggerisce che questo è il comportamento progettato: "** Questa chiamata si verifica non appena il server ha visto tutte le modifiche ai record e può essere richiamato mentre il server sta elaborando il lato effetti di tali modifiche. ** " – George