performBlockAndWait: Kök yönetilen nesne içeriğini senkronize olarak senkronize etmek geçici olmayan Nesne ID'leri sağlamaz

İOS5 sürüm notlarını ve WWDC2011 sunum örneklerini takiben, NSPrivateQueueConcurrencyType türü olarak kök yönetilen nesne bağlamı hazırlarım. NSMainQueueConcurrencyType (varsayılan içerik olarak adlandırılır) türünde bir alt içerik var.

Alt bağlamı kaydettiğimde, blok API'yi kullanarak kök bağlamı kaydet: performBlockAndWait: , işlemin senkronize olmasını bekliyorum.

Yani, bu blok yürütüldükten hemen sonra, veri deposuna tam olarak yerleştirilen tüm nesneler için geçici olmayan ObjectID 'ler alabilmeliyim.

Bununla birlikte, bunun yerine geçici nesne kimliklerini alıyorum! Sanki performBlockAndWait: , performBlock: değerine dönüşür ve zaman uyumsuz olarak çalışır. Ama neden?

Bu bir hata mı, yoksa bazı temel varsayımları eksik mi?

İşte bazı ilgili kod:

// Setup of the root MOC:
__rootContext = [[NSManagedObjectContext alloc] 
    initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[__rootContext setPersistentStoreCoordinator:[self coordinator]];

// Setup of the child MOC; I use it as the "default" context:
__defaultContext = [[NSManagedObjectContext alloc] 
    initWithConcurrencyType:NSMainQueueConcurrencyType];
[__defaultContext setParentContext:__rootContext];

// Here's the essence of the save operation:
[__defaultContext save:&error]

// Setup a block I can invoke that does the save:
void (^rootContextSaveOperation)(void) = ^{
    NSError *rootContextError = nil;
    BOOL wasRootContextSaveSuccessful = [rootContext save:&rootContextError];
    if (!wasRootContextSaveSuccessful) { 
        NSLog(@"RPDataStore: Error saving root context."); }
    };

// Call perform block and wait with the operation:
[__rootContext performBlockAndWait:rootContextSaveOperation];

// Now when I inspect one of the objects just saved, I have this check in my unit test:
BOOL isTempID = [[user objectID] isTemporaryID];

Buradaki sorun, MOC hiyerarşisinin "kullanıcı" nesne kısmı için, sadece yaprak MOC'undan köke kaydedilmiş, "isTempID" bayrağı maalesef "EVET" ibaresidir.

Beklentim, diğer bağlamlarda kullanabileceğim kalıcı bir Nesne Kimliği almak için senkronize olarak bir tasarruf gerçekleştirebilmekti.

performBlockAndWait: hakkındaki kavramsal beklentilerim yanlış mı?

Öyleyse, bu MOC kuyruğu yapılandırmasıyla senkronize olarak nasıl tasarruf edebilirim ve hala geçici olmayan ObjectID'leri hemen alabilir miyim?

3
Yorumlarınızı bir cevaba taşıyın ve 24 saat sonra kabul edin. Aksi takdirde, bu soru sonsuza dek cevapsız olarak gösterilecektir.
katma yazar TechZen, kaynak
Resmi geliştirici forumlarında az önce bunun bir hata olduğunu gördüm. Kayıtlı olanlar için bu konuya bakın: devforums.apple.com/thread/129303? tstart = 0
katma yazar idStar, kaynak
Thanks @TechZen - Ben taşındı ve önerildiği gibi kabul edecek.
katma yazar idStar, kaynak

1 cevap

Yardım edebileceği için, geçici çözümüm, onu benzersiz bir şekilde alabilecek yönetilen nesne için bir alma tahmini oluşturmaktı.

Bu getiriyi kök yönetilen nesne bağlamına karşı yürütüyorum ve daha sonra, daha önce kaydettiğim yönetilen nesneler için geçici olmayan bir Nesne Kimliği güvenilir bir şekilde alıyorum. Benim durumumda, bir aramada hangi anahtarların kullanılabileceğini ve bunları benzersiz bir şekilde tanımlayabileceklerini bildiren nesneler zaten yönetti.

Diğer seçenek, bağlamdaki tüm nesneler için alt bağlamdan ilk kaydedilmeden önce kalıcı Nesne Kimlikleri elde etmektir. Ardından, kapsamdaki belirli bir nesnenin geçerli başvurusunu yenilemek için NSManagedObjectContext'in refreshObject: mergeChanges: öğesini kullanabilirsiniz. Şimdi sadece çocuk bağlamında kaydedilen değişiklikleri yansıtacak.

Obtain permanent object IDs using NSManagedObjectContext's method obtainPermanentIDsForObjects:error:

2
katma