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