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:
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ó.
Nếu tôi sử dụng NSPrivateQueueConcurrencyType
, tôi sẽ chỉ sử dụng MOC từ bên trong performBlock
hoặc performBlockAndWait
.
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.
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
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
Xin lỗi, tôi đã không theo dõi câu hỏi đó. –