Val*_*din 6 multithreading core-data objective-c grand-central-dispatch ios
我想对Core Data使用多线程.我在NSManageObjects中解析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];
//...
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*n R 31
performBlock只能用的被管理对象的上下文(MOC)中使用NSMainQueueConcurrencyType或
NSPrivateQueueConcurrencyType.在您的情况下,您应该创建上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
Run Code Online (Sandbox Code Playgroud)
并且无需创建调度队列或使用dispatch_async().MOC创建并管理自己的队列,并performBlock确保在MOC队列上执行该块.
| 归档时间: |
|
| 查看次数: |
5611 次 |
| 最近记录: |