只能在使用队列创建的NSManagedObjectContext上使用-performBlock :.

时间:2013-07-15 08:39:39

标签: ios objective-c multithreading core-data grand-central-dispatch

我想在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];
    //...
}

1 个答案:

答案 0 :(得分:31)

performBlock只能与NSMainQueueConcurrencyType或{的托管对象上下文(MOC)一起使用 NSPrivateQueueConcurrencyType。在您的情况下,您应该使用

创建上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
                     initWithConcurrencyType:NSPrivateQueueConcurrencyType];

无需创建调度队列或使用dispatch_async()。  MOC创建并管理自己的队列, 并且performBlock确保该块在MOC的队列中执行。