performBlockAndWait: ildiz boshqariladigan ob'ekt mazmunini sinxron ravishda vaqtinchalik ob'ekt identifikatorlarini taqdim qilmaydi

IOS5 versiyasi va WWDC2011 taqdimot misollaridan so'ng, ildiz boshqariladigan ob'ekt mazmunini NSPrivateQueueConcurrencyType turi sifatida o'rnatish. NSMainQueueConcurrencyType (standart kontekst deb ataladigan) turidagi bolali kontekstim bor.

Bola kontekstini saqlaganimda, ildiz kontentini blok API yordamida saqlang: performanceBlockAndWait: , men operatsiyani sinxronlashtirib kutaman.

Ya'ni, ushbu blok bajarilgandan so'ng, faqatgina ma'lumotlar do'koniga kiritilgan barcha narsalar uchun vaqtinchalik ObjectID ni olishim kerak.

Ammo, o'rniga, vaqtinchalik obyekt identifikatorlarini olaman! performanceBlockAndWait: kodi performanceBlock: ga degeneratsiya qiladi va async ishlaydi. Lekin nega?

Bu xatomi yoki men ba'zi bir asosiy taxminlarni yo'qotmayapmanmi?

Quyidagi kod mavjud:

// 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];

Muammo shundaki, MOC ierarxiyasidagi "foydalanuvchi" ob'ektining faqatgina yaproq MOC dan saqlanib qolgan qismi uchun afsuski, "isTempID" bayrog'i "YES" ni ko'rsatadi.

Men umid qilamanki, boshqa kontekstlarda foydalanishi mumkin bo'lgan doimiy ob'ektni olish uchun sinxronizatsiya qilishim mumkin.

performanceBlockAndWait: ning kontseptual istiqbollari noto'g'ri?

Agar shunday bo'lsa, qanday qilib bu MOC tartibida konfiguratsiyani sinxron tarzda saqlay olaman va darhol vaqtinchalik bo'lmagan ObjectID-ni olaman?

3
Javoblaringizni sharhingizga o'tkazing va 24 soatdan keyin uni qabul qiling. Aks holda, bu savol abadiy javobsiz qoladi.
qo'shib qo'ydi muallif TechZen, manba
Rasmiy ishlab chiquvchilar forumlarida faqat bu xato ekanligini ko'rishdi. Sizning ro'yxatdan o'tganlaringiz uchun quyidagi mavzuni ko'ring: devforums.apple.com/thread/129303? tstart = 0
qo'shib qo'ydi muallif idStar, manba
Rahmat @TechZen - Men uni ko'chirib o'tkazdim va tavsiya etilganlarni qabul qilaman.
qo'shib qo'ydi muallif idStar, manba

1 javoblar

Kim uchun foydali bo'lishi mumkin, mening vaqtinchalik halim uni boshqariladigan ob'ekt uchun oldindan taxmin qilishni yaratish edi.

Ushbu qabul qilishni ildiz boshqariladigan ob'ekt mazmuniga qarshi olib boraman va bundan keyin ishonchli tarzda ilgari saqlagan narsalar uchun vaqtinchalik ob'ektni identifikatorini olaman. Mening ishimda men qanday kalitlarni ishlatish mumkinligini aniqlaydigan narsalarni boshdan o'tkazdim.

Boshqa variant esa, bu kontekstdagi barcha ob'ektlar uchun doimiy ob'ektni identifikatsiyalashni bolaning kontekstini saqlashdan oldin amalga oshirishdir. NSManagedObjectContext-ning refreshObject: mergeChanges: dan foydalanishingiz mumkin. Endi u faqatgina bolaligida saqlangan o'zgarishlarni aks ettiradi.

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

2
qo'shib qo'ydi