2012-08-25 28 views
5

Điều gì phù hợp hơn với tình huống dữ liệu cần được lưu trữ trong Core-Data trên một luồng và đọc từ Core-Data trên một luồng khác?NSOperation VS GCD cho Core-Data

Tôi đã nghĩ đến GCD nhưng nó hoạt động như thế nào với việc tạo ra NSManagedObjectContext cho mỗi luồng? Làm thế nào để tạo ra các đối tượng này trong một hàng đợi?

Lưu trữ dữ liệu cần được cập nhật/đồng bộ hóa khi thay đổi được thực hiện trên nhiều luồng khác nhau, điều này có tốt hơn khi thực hiện với GCD hoặc NSOperation không?

Tôi muốn chỉ có thể chuyển khối tới 2 hàng đợi khi đọc và ghi vào kho dữ liệu khi cần, mà không gặp vấn đề với việc hỏng cửa hàng hoặc có các phiên bản khác nhau của cửa hàng.

Trả lời

16

Cuộc tranh luận giữa GCD và NSOperation cơ bản để nắm cho lập luận của việc sử dụng mức trừu tượng cao nhất cung cấp cho bạn một giải pháp tốt.

NSOperationQueue được xây dựng trên đầu trang của GCD, do đó, nó phải là một mức trừu tượng cao hơn.

Tuy nhiên, GCD rất dễ sử dụng trong trường hợp chung, tôi thấy thích hợp hơn là NSOperationQueue trong nhiều trường hợp.

Bây giờ, khi bạn đưa CoreData vào danh sách kết hợp, tôi sẽ đề xuất phương án thay thế thứ ba. Nếu bạn đang sử dụng iOS 5, thì bạn có thể sử dụng đồng thời hàng đợi riêng với MOC của bạn. Tôi thấy đó là một trừu tượng tốt, và cung cấp một giao diện dễ sử dụng.

Vì vậy, tôi sẽ đề nghị bạn chỉ cần tạo một MOC với NSPrivateQueueConcurrencyType cho mỗi chủ đề mà bạn muốn làm Dữ liệu cốt lõi. Bạn có thể chọn, dựa trên đặc điểm ứng dụng của bạn, cho dù chia sẻ một persistentStoreCoordinator hoặc sử dụng một riêng biệt. Bạn thậm chí có thể sử dụng ngữ cảnh lồng nhau (với một caveat cho chèn-side).

Về cơ bản, nó sau mô hình này ...

NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType]; 
moc.parentContext = contextIWantToBeParent; 
moc.persistentStoreCoordinator = pscIWant; 

[moc performBlock:^{ 
    // Your MOC stuff running on its own private queue 
}]; 

Tất nhiên, bạn phải chọn một phương pháp (hoặc cha mẹ đến một MOC hiện có hoặc gắn vào một PSC).

Tôi thường thích phương thức performBlock.

EDIT

Cảm ơn. Tôi đọc rằng thread NSManagedObject không an toàn. Làm thế nào để tôi tạo NSManagedObject mới trên hàng đợi riêng tư đó? - Helium3

Vâng, đó là sự thật. Tuy nhiên, khi bạn tạo một MOC với một loại tương tranh, bạn đồng ý với một hợp đồng mà đi một cái gì đó như thế này.

tôi, một lập trình viên sắc sảo, làm long trọng đồng ý với Core Data Quy định sau đây liên quan đồng thời:

  1. Nếu tôi sử dụng NSConfinementConcurrencyType, tôi sẽ chỉ sử dụng nó trong khi chạy trên các chủ đề đã tạo ra nó.

  2. Nếu tôi sử dụng NSPrivateQueueConcurrencyType, tôi sẽ chỉ sử dụng MOC từ bên trong performBlock hoặc performBlockAndWait.

  3. Nếu tôi sử dụng NSMainQueueConcurrencyType, tôi sẽ chỉ sử dụng MOC từ bên trong performBlock, performBlockAndWait hoặc khi tôi biết rằng tôi đang chạy trên chuỗi chính.

Nếu bạn làm theo các quy tắc đó, bạn sẽ có thể sử dụng MOC trên các chủ đề khác.

Cụ thể, khi sử dụng performBlock, API dữ liệu cốt lõi sẽ đảm bảo mã được đồng bộ hóa một cách thích hợp.

+0

Cảm ơn. Tôi đọc rằng thread NSManagedObject không an toàn. Làm cách nào để tạo NSManagedObject mới trên hàng đợi riêng tư đó? – jarryd

+0

Cảm ơn bạn đã chỉnh sửa. Vì vậy, nếu NSManageObjects được thêm vào cửa hàng hoặc được chỉnh sửa bởi MOC với đồng thời, không cần phải đồng bộ hóa thủ công cửa hàng? – jarryd

+0

Xin lỗi, tôi đã không theo dõi câu hỏi đó. –