2013-07-11 26 views
8

Về cơ bản, tôi chỉ sử dụng một moc trong ứng dụng của mình, nhưng tôi nghĩ tôi nên sử dụng nhiều NSManagedObjectContext trong một số trường hợp.khi nào và tại sao sử dụng nhiều NSManagedObjectContext?

  1. khi nào tôi nên sử dụng nhiều NSManagedObjectContext?
  2. Tôi đã nghe nói rằng tôi nên sử dụng 3 triệu trong một số trường hợp, nhưng tôi không biết trường hợp nào tôi nên sử dụng 3 triệu?
+0

Lý do duy nhất tôi có thể nghĩ là nếu bạn có bộ dữ liệu riêng biệt bạn có thể muốn truy cập độc lập. – Kevin

Trả lời

15

Thông thường, bạn muốn sử dụng một riêng biệt NSManagedObjectContext cho mỗi chủ đề đó sẽ truy cập vào db Core Data. Điều này là để ngăn chặn các đồ thị đối tượng từ khả năng nhận được vào một nhà nước không phù hợp do đồng thời viết cho cùng một bối cảnh.

Cách đơn giản nhất để xử lý việc này là tạo NSManagedObjectContext mới cho mỗi chuỗi và chia sẻ một đơn NSPersistentStoreCoordinator.

Tạo thuộc tính trong AppDelegate loại NSManagedObjectContext và ghi đè trình getter để trả lại ngữ cảnh mới cho mỗi chuỗi cuộc gọi. Làm điều này bằng cách sử dụng các threadDictionary của mỗi chủ đề.

Trước tiên, hãy thiết lập managedObjectModel và persistentStoreCoordinator như bình thường. Sau đó tạo ngữ cảnh của bạn trong appdelegate của bạn và gán cho tài sản của bạn:

self.managedObjectContext = [[NSManagedObjectContext alloc] init]; 
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator; 

Trong managedObjectContext getter override của bạn, sử dụng đoạn mã sau để trả về một bối cảnh riêng biệt cho mỗi thread gọi:

- (NSManagedObjectContext *) managedObjectContext 
{ 
    NSThread *thisThread = [NSThread currentThread]; 
    if (thisThread == [NSThread mainThread]) 
    { 
     //For the Main thread just return default context iVar  
     return _managedObjectContext; 
    } 
    else 
    { 
     //Return separate MOC for each new thread   
     NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"]; 
     if (threadManagedObjectContext == nil) 
     { 
      threadManagedObjectContext = [[[NSManagedObjectContext alloc] init]; 
      [threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]]; 
      [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"]; 

     } 

     return threadManagedObjectContext; 
    } 
} 

Bây giờ bất cứ nơi nào trong mã của bạn nơi bạn truy cập thuộc tính managedObjectContext của AppDelegate, bạn sẽ chắc chắn là luồng an toàn.

+0

Cách tốt nhất để duy trì "MOC_KEY" duy nhất cho mỗi NSThread là gì? –

2

Liên kết sau giải thích rõ ràng khi nào, tại sao và cách sử dụng Nhiều bối cảnh đối tượng được quản lý.

http://www.cocoanetics.com/2012/07/multi-context-coredata/

Sau đây là hai lý do chính để sử dụng nhiều bối cảnh đối tượng quản lý.

  • Để đặt NSManagedObjectContext chỉ an toàn, vì NSManagedObjectContext không an toàn.
  • Khóa NSManagedObjectContext để hiển thị dữ liệu trên giao diện người dùng. Điều đó có nghĩa là khi bạn đang hiển thị dữ liệu trên giao diện người dùng và cũng tìm nạp dữ liệu từ máy chủ, chúng tôi sẽ tìm nạp dữ liệu trên con NSManagedObjectContext để tránh sự cố đồng thời và tắc nghẽn UI.
Các vấn đề liên quan