2012-10-13 29 views
5

Tôi chịu mọi hậu quả khi sử dụng một MOC đơn lẻ trong nhiều luồng - ứng dụng của tôi bị treo tại các điểm ngẫu nhiên vì MOC được tạo trong chủ đề chính và tôi cũng sử dụng nó để điền vào DB một chủ đề khác. Mặc dù mã được đồng bộ hóa (@synchronize) bằng cách sử dụng một singleton toàn cục mà ứng dụng gặp sự cố. Tôi đọc rằng sử dụng một MOC riêng biệt cho mỗi chủ đề sẽ làm cho mọi thứ ok nhưng tôi cũng đọc rằng nó được coi là một cách tiếp cận xấu để chia sẻ NSManagedObjects trên chủ đề.Core Data - chia sẻ NSManagedObjects trong nhiều chủ đề

Trường hợp sử dụng của tôi như sau: 1) Tôi tải và phân tích cú pháp XML từ máy chủ và trong khi phân tích cú pháp, tôi chèn mỗi NSManagedObject mới vào cơ sở dữ liệu. Điều này tất cả xảy ra trong một chủ đề riêng biệt. 2) Từ chủ đề chính, người dùng tương tác với giao diện người dùng đọc dữ liệu từ cơ sở dữ liệu.

Trong cả hai chủ đề tôi sử dụng NSManagedObjects. Bạn đề nghị tôi sửa lỗi này như thế nào? Tôi đã thất bại nhiều lần rồi. Thông thường, ứng dụng bị lỗi khi gợi ý rằng tôi đang sửa đổi một bộ sưu tập trong khi liệt kê nó là không đúng vì mã được đồng bộ và trong khi tôi lặp lại nó không sửa đổi và ngược lại - trong khi tôi sửa đổi nó, tôi không ' t lặp lại và tôi lưu một khi tôi đã hoàn tất.

Trả lời

8

Sử dụng một NSManagedObjectContext cho mỗi chủ đề. Nếu bạn giao tiếp giữa các chủ đề, hãy vượt qua NSManagedObjectID, là luồng an toàn và tìm nạp lại đối tượng từ ngữ cảnh luồng của bạn. Trong các ứng dụng của tôi, đôi khi tôi thậm chí sử dụng một ngữ cảnh cho mỗi bộ điều khiển.

Để quản lý các ngữ cảnh khác nhau, hãy đăng ký Trình theo dõi cho NSManagedObjectContextDidChangeNotification. Trong xử lý thông báo này, bạn chuyển thông báo đến từng ngữ cảnh của mình qua phương thức mergeChangesFromContextDidSaveNotification:. Phương pháp này là chủ đề lưu và làm cho bối cảnh cập nhật trạng thái của nó.

Sau đó, bạn phải làm mới chế độ xem của mình. Nếu bạn có ứng dụng dựa trên chế độ xem bảng, hãy xem NSFetchedResultsController. Điều này giúp bạn tự động cập nhật bảng với các hoạt ảnh thích hợp. Nếu bạn không sử dụng chế độ xem bảng, bạn phải tự mình thực hiện cập nhật giao diện người dùng.

5

Nếu bạn chỉ hỗ trợ iOS 5 trở lên, bạn không cần phải xử lý NSManagedObjectID và các bối cảnh hợp nhất nữa. Bạn có thể sử dụng các loại đồng thời mới NSManagedObjectContext thay thế. Sau đó, thực hiện các thao tác của bạn trong phạm vi managedObjectContext:performBlock và chúng sẽ tự động được hợp nhất.

Xem câu trả lời từ svena tại đây để biết thêm thông tin: Core Data and Concurrency using NSOperationQueues

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