I want to use multithreading with Core Data. I parse xml-file in NSManageObjects. I use the code below and I get runtime error Can only use -performBlock: on an NSManagedObjectContext that was created with a queue. What's wrong?
//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];
//...
}
performBlock can only be used with a managed object context (MOC) of the NSMainQueueConcurrencyType or
NSPrivateQueueConcurrencyType. In your case, you should create the context with
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
And there is no need to create a dispatch queue or use dispatch_async().
The MOC creates and manages its own queues,
and performBlock ensures that the block is executed on the MOC's queue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With