2014-06-11 22 views
5

Resmi belgeler CloudKit tutarlılığı hakkında bir şeyler söyler mi? tüm yansıtacak bir kuvvetle tutarlı okuma zorlamak için bir yolu var mıCloudKit güçlü bir şekilde tutarlı mı, yoksa tutarlı mı?

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); 

: Bu işe yarayabilecek ve (boş sonuçları döndüren) olmayabilir yazdıktan sonra hemen bir kayıt okuma - Benim testlere göre sonunda tutarlı görünmektedir önceki güncellemeler

+0

Testlerimde de aynı şeyi farkettim. Bir kaydı kaydediyorum ve bunu başarıyla tamamlamak için bekliyorum. Daha sonra tüm kayıtlar için bir sorgu yaparsam, yeni kaydım geri dönmez. CloudKit'in sonunda tutarlı olduğunu belirten herhangi bir bilgi buldunuz mu? –

+0

Kullanım durumum çok kolaydı, bu yüzden sorunu veri deposu katmanında bir çeşit önbellekle “çözdüm”: bir öğe veri deposuna eklendiğinde, kısa bir süre için istemcide depolanan iCloud _and_ dosyasına yazılır. Veri deposu katmanı sorgulandığında, canlı önbellek kayıtlarını sonuç kümesine ekler. Aptal ama işe yarıyor. – zoul

+1

@zoul bunun için daha iyi bir yol bulabilir mi? ChangeRecordsCompletionBlock için CKModifyRecordsOperation.h satır içi yorumunun son kısmı, bunun tasarlanan davranış olduğunu belirtir: "** Bu çağrı, sunucu tüm kayıt değişikliklerini gördüğü anda içeriyorsa ve sunucu tarafını işlerken çağrılabilir Bu değişikliklerin etkilerini etkiler. ** " – George

cevap

0

"Nihai tutarlılık" terimindeki tek deneyimim, tutarlı olarak tutarlı olan CouchDB'yi kullanmaktır. CloudKit, CouchDB'nin dağıtılmış veri tabanlarını çoğaltmasına izin verirken, CouchDB'den çok farklıdır, buna karşılık CloudKit yalnızca "iCloud sunucularına veri aktarımını yönetmek için servisler" sağlar - sadece bir ulaşım mekanizmasıdır.

Taşıma mekanizmasının kendisinin tutarlı bir şekilde tutarlı olmadığından eminim - doğrudan CloudKit sunucusundan kaydeder ve alınır.

CloudKit yalnızca bir aktarım mekanizması olduğundan, kendi yerel önbelleğinizi/veritabanınızı korumak sizin sorumluluğunuzdadır. Yerel veritabanınız nihayet tutarlı olarak kabul edilir, çünkü senkronizasyonlar arasında tutarlı bir şekilde tutarlı değildir ve sadece CloudKit kullanarak onu senkronize ettiğinizde tutarlı olur.

Şimdi, testlerinizde kaydettiğinizi ve daha sonra bir kayıt almaya çalıştığınızı söylüyorsunuz. Ancak kodunuzda, kaydetme işlemindeki hataları denetlemediğinizi fark ettim. Yani, belki de kayıp sırasında kayıp olduğunu bir hata var mı?

+0

Apple'ın iCloud altyapısını bilmiyorum, ancak bir çeşit yük dengeleme şemasının arkasında çalışan birçok farklı iCloud sunucusu olduğundan şüpheleniyorum.Dolayısıyla, bir kaydı kaydetme çağrısının, bir sonraki çağrının farklı bir örneğe yönlendirilmesi sırasında tek bir sunucu örneğine yönlendirilebilmesi mümkün görünüyor. ICloud'un bu örnekleri senkronize halde tuttuğuna bağlı olarak, bir nihai tutarlılık modeline sahip olmak, burada beklemek için oldukça makul olabilir. –

7

Her ikisinden de biraz: CloudKit, tanımlayıcı tarafından bir kayıt getirdiğinizde, ancak bir sorguyla bir kaydı getirdiğinizde tutarlı olarak tutarlı bir şekilde tutarlı olur.

CKModifyRecordsOperation başarılı bir şekilde geri döndüğünde, kayıt hemen kimliği ile alınabilir. Ancak, sunucunun kayıt değerlerini taraması ve arama dizinlerini güncelleştirmesi ve dağıtması biraz zaman alır. Üste | Endeksleme tamamlanana kadar, herhangi bir sorgudaki kaydı görmezsiniz.

İlgili konular