Czy oficjalne dokumenty mówią gdzieś o spójności CloudKit? Według moich badań wydaje się być ostatecznie zgodna - natychmiast czytając zapis po zapisie może działać i nie może (zwrotach pustych wyniki):Czy CloudKit jest silnie spójny, czy ostatecznie spójny?
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);
Czy istnieje sposób, aby wymusić silnie spójne lektury, które odzwierciedlają wszystkie poprzednie aktualizacje?
Zauważam to samo w moich testach. Zapisuję rekord i czekam, aż to się uda. Jeśli następnie wykonam zapytanie dla wszystkich rekordów, mój nowy rekord nie zostanie zwrócony. Czy znalazłeś jakieś informacje stwierdzające, że CloudKit jest ostatecznie spójny? –
Mój przypadek użycia był na szczęście bardzo prosty, więc "rozwiązałem" problem z rodzajem cache w warstwie magazynu danych: kiedy element jest wstawiany do magazynu danych, jest on zapisywany do iCloud _i_ przechowywany na kliencie przez krótki czas. A kiedy pyta się o warstwę magazynu danych, dodaje ona do tabeli wynikowej żywe rekordy. Głupi, ale działa. – zoul
@Zoul kiedykolwiek znaleźć lepszy sposób radzenia sobie z tym? Ostatnia część komentarza wbudowanego w CKModifyRecordsOperation.h dla modifyRecordsCompletionBlock sugeruje, że jest to zaprojektowane zachowanie: "** To wywołanie dzieje się, gdy serwer ma widoczne wszystkie zmiany rekordów i może zostać wywołane, gdy serwer przetwarza stronę efekty z tych zmian. ** " – George