7

Core Data でマルチスレッドを使用したい。sで xml ファイルを解析しますNSManageObject。以下のコードを使用すると、実行時エラーが発生します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];
    //...
}
4

1 に答える 1

31

performBlockNSMainQueueConcurrencyTypeまたは の管理対象オブジェクト コンテキスト (MOC) でのみ使用できますNSPrivateQueueConcurrencyType。あなたの場合、コンテキストを作成する必要があります

NSManagedObjectContext *context = [[NSManagedObjectContext alloc]
                     initWithConcurrencyType:NSPrivateQueueConcurrencyType];

また、ディスパッチ キューを作成したり、 を使用したりする必要はありませんdispatch_async()。MOC は独自のキューを作成および管理しperformBlock、MOC のキューでブロックが実行されるようにします。

于 2013-07-15T08:47:18.747 に答える