2014-06-11 9 views
5

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?

+0

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? –

+0

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

+1

@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

Odpowiedz

0

Moje jedyne doświadczenie z określeniem „ostatecznego spójności” jest od używania CouchDB, która jest ostatecznie spójne. CloudKit różni się bardzo od CouchDB tym, że CouchDB pozwala na replikowanie rozproszonych baz danych, podczas gdy CloudKit zapewnia tylko "usługi zarządzania transferem danych do iz serwerów iCloud" - jest to tylko mechanizm transportowy.

Jestem całkiem pewien, że sam mechanizm transportu nie jest ostatecznie zgodny - zapisuje i odczytuje się bezpośrednio z serwera CloudKit.

Od CloudKit jest tylko mechanizm transportu, jesteś odpowiedzialny za utrzymanie własnego lokalnego cache/bazy danych. Twoja lokalna baza danych byłaby ostatecznie uważana za spójną, ponieważ niekoniecznie jest spójna pomiędzy synchronizacjami i staje się spójna tylko wtedy, gdy ostatecznie zsynchronizujesz ją za pomocą CloudKit.

Teraz mówisz, że podczas testów zapisujesz, a następnie próbujesz odzyskać zapis. Ale zauważam w twoim kodzie, że nie sprawdzasz błędów w operacji składowania. Być może podczas składowania brakuje błędu?

+0

Nie wiem o infrastrukturze iCloud Apple, ale podejrzewam, że istnieje wiele różnych serwerów iCloud działających za jakimś schematem równoważenia obciążenia.Wydaje się więc całkowicie możliwe, że wywołanie zapisu rekordu może być kierowane do instancji jednego serwera, podczas gdy kolejne wywołanie jest kierowane do innej instancji. W zależności od tego, jak dobrze iCloud utrzymuje synchronizację tych instancji, posiadanie ostatecznego modelu spójności może wydawać się całkiem rozsądne. –

7

To trochę jak: CloudKit jest silnie spójne jeśli pobrać rekordu przez identyfikator, ale ostatecznie spójne, jeśli pobrać rekord z kwerendy.

Kiedy CKModifyRecordsOperation wraca pomyślnie rekord jest natychmiast fetchable przez jego identyfikator.

Jednak to zajmuje trochę czasu, aby serwer do skanowania wartości rekordu oraz aktualizacji i dystrybucji swoich indeksów wyszukiwania. Dopóki indeksowanie się nie zakończy, nie zobaczysz rekordu w żadnych zapytaniach.

Powiązane problemy