5

Voglio utilizzare il multithreading con Core Data. Analizzo il file xml in NSManageObject s. Io uso il codice qui sotto e ottengo l'errore di runtime Can only use -performBlock: on an NSManagedObjectContext that was created with a queue. Cosa c'è che non va?Può utilizzare solo -performBlock: su un NSManagedObjectContext creato con una coda

//xmlParser 

- (void)main 
{ 
    dispatch_queue_t queueB = dispatch_queue_create("Create Books", NULL); 
    dispatch_async(queueB, ^{ 
     // Opening xml 
     // ... 
     NSManagedObjectContext* context = [[NSManagedObjectContext alloc] init]; 
     [context setPersistentStoreCoordinator:mainContext].persistentStoreCoordinator]; 
     [context performBlock:^{ 
      // ... 
      [self _parseNode:container_node appendTo:books inContext:context]; 
      // ... 
      NSError* error = nil; 
      [context save:&error]; 
      [mainContext performBlock:^{ 
       NSError* parentError = nil; 
       [mainContext save:&parentError]; 
      }]; 
     }]; 
     [context release]; 
    }); 
    dispatch_release(queueB); 
} 

- (int)_parseNode:(axlNode*)inode appendTo:(NSMutableArray*)ioarray inContext:(NSManagedObjectContext*)context 
{ 
    // ... 
    [context executeFetchRequest:request error:&error]; 
    //... 
} 

risposta

31

performBlock può essere utilizzato solo con un contesto oggetto gestito (MOC) del NSMainQueueConcurrencyType o NSPrivateQueueConcurrencyType. Nel tuo caso, è necessario creare un contesto con

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] 
        initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

e non c'è bisogno di creare una coda di spedizione o utilizzare dispatch_async(). Il MOC crea e gestisce le proprie code, e performBlock assicura che il blocco venga eseguito sulla coda del MOC.

+0

Se solo la documentazione non fosse così vaga su questo punto ... stavo ancora avvolgendo initWithConcurrencyType: in un blocco di invio e creando una coda personalizzata come la documentazione lasciava intendere che dovevi farlo ... Grazie! –

+0

@RobGlassey: Sfortunatamente, la "Guida alla programmazione dei dati fondamentali" non è stata ancora aggiornata per i nuovi tipi di concorrenza, è documentata solo nelle ["Note di rilascio dei dati di base per OS X v10.7 e iOS 5.0"] (http: //developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/index.html). –

+0

Aha, eccolo! Chiaro come il giorno Tuttavia, iOS 5 non è mai stato fuori così a lungo ... probabilmente sposteranno importanti titoli come questo nelle principali guide di riferimento prima che finiscano troppo a lungo. –

Problemi correlati