我想在 Core Data 中使用多线程。我在 NSManageObject
中解析 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];
//...
}
最佳答案
performBlock
只能与 NSMainQueueConcurrencyType
的托管对象上下文 (MOC) 一起使用,或者
NSPrivateQueueConcurrencyType
。在您的情况下,您应该使用
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
并且无需创建调度队列或使用 dispatch_async()
。
MOC 创建和管理自己的队列,
performBlock
确保 block 在 MOC 的队列上执行。
关于ios - 只能使用-performBlock : on an NSManagedObjectContext that was created with a queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649985/