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