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];
//...
}
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! –
@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). –
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. –