5

Chcę używać wielowątkowości z danymi podstawowymi. Analizuję plik xml w NSManageObject s. Korzystam z poniższego kodu i pojawia się błąd runtime Can only use -performBlock: on an NSManagedObjectContext that was created with a queue. Co jest nie tak?Może używać tylko -performBlock: w obiekcie NSManagedObjectContext utworzonym przy użyciu kolejki

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

Odpowiedz

31

performBlock może być używany tylko z zarządzanego kontekście obiektu (MOC) w NSMainQueueConcurrencyType lub NSPrivateQueueConcurrencyType. W twoim przypadku, należy utworzyć kontekst z

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

I nie ma potrzeby, aby utworzyć kolejkę wysyłki lub użyć dispatch_async(). MOC tworzy własne kolejki i zarządza nimi, i performBlock zapewnia, że ​​blok zostanie wykonany w kolejce MOC.

+0

Jeśli tylko dokumentacja nie była tak nieprecyzyjna w tym punkcie ... Nadal pakowałem initWithConcurrencyType: w bloku wysyłkowym i tworząc kolejkę niestandardową, ponieważ dokumentacja podpowiadała, że ​​musiałaś to zrobić ... Dzięki! –

+0

@RobGlassey: Niestety, "Przewodnik programowania podstawowych danych" nie został jeszcze zaktualizowany dla nowych typów współbieżności, jest on udokumentowany tylko w ["Podstawowe informacje o wersji dla systemu OS X 10.7 i iOS 5.0"] (http: //developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/index.html). –

+0

Aha, tu jest! Wyczyść jak dzień. Jednak iOS 5 nie był tak długo w rzeczywistości ... prawdopodobnie przedłużyliby podstawowe informacje o tym rodzaju w główne przewodniki referencyjne. –