我想在Core Data中使用多线程。我在NSManageObject
s中解析xml文件。我使用下面的代码,我得到运行时错误Can only use -performBlock: on an NSManagedObjectContext that was created with a queue
。怎么了?
//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];
//...
}
答案 0 :(得分:31)
performBlock
只能与NSMainQueueConcurrencyType
或{的托管对象上下文(MOC)一起使用
NSPrivateQueueConcurrencyType
。在您的情况下,您应该使用
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
无需创建调度队列或使用dispatch_async()
。
MOC创建并管理自己的队列,
并且performBlock
确保该块在MOC的队列中执行。