I want to use multithreading with Core Data. I parse xml-file in NSManageObject
s. 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