5

Tôi muốn sử dụng đa luồng với Dữ liệu lõi. Tôi phân tích cú pháp xml-file trong NSManageObject s. Tôi sử dụng mã bên dưới và tôi gặp lỗi thời gian chạy Can only use -performBlock: on an NSManagedObjectContext that was created with a queue. Chuyện gì vậy?Chỉ có thể sử dụng -performBlock: trên NSManagedObjectContext được tạo với hàng đợi

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

Trả lời

31

performBlock chỉ có thể được sử dụng với một bối cảnh đối tượng quản lý (MOC) của NSMainQueueConcurrencyType hoặc NSPrivateQueueConcurrencyType. Trong trường hợp của bạn, bạn nên tạo ngữ cảnh với

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

Và không cần phải tạo hàng đợi công văn hoặc sử dụng dispatch_async(). MOC tạo và quản lý hàng đợi của riêng mình, và performBlock đảm bảo rằng khối được thực hiện trên hàng đợi của MOC.

+0

Nếu chỉ tài liệu không mơ hồ về điểm này ... Tôi vẫn gói initWithConcurrencyType: trong khối công văn và tạo hàng đợi tùy chỉnh làm tài liệu gợi ý bạn phải làm như vậy ... Cảm ơn! –

+0

@RobGlassey: Thật không may, "Hướng dẫn lập trình dữ liệu cốt lõi" chưa được cập nhật cho các loại đồng thời mới, nó chỉ được ghi lại trong [Ghi chú phát hành dữ liệu cốt lõi cho OS X v10.7 và iOS 5.0 "] (http: //developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/index.html). –

+0

Aha, đúng rồi! Xóa trong ngày. Tuy nhiên, iOS 5 đã không được ra rằng dài thực sự ... họ có thể sẽ di chuyển các titbits cần thiết như thế này vào hướng dẫn tham khảo chính trước khi quá dài. –

Các vấn đề liên quan