Cacao/ứng dụng của tôi có một bối cảnh đối tượng được quản lý trên luồng chính. Khi tôi cần cập nhật dữ liệu của tôi chương trình của tôi sẽ:Dữ liệu chính hợp nhất hai bối cảnh đối tượng được quản lý
- Bắt đầu một chủ đề mới
- Nhận dữ liệu mới từ một máy chủ
- Tạo một Managed Object Bối cảnh mới
- Gửi thông báo tới các chủ đề chính để hợp nhất hai ngữ cảnh
Đây là chức năng nhận thông báo trên sợi chính
- (void)loadManagedObjectFromNotification:(NSNotification *)saveNotification
{
if ([NSThread isMainThread]) {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
} else {
[self performSelectorOnMainThread:@selector(loadManagedObjectFromNotification:) withObject:saveNotification waitUntilDone:YES];
}
}
Tôi không nhận được bất kỳ lỗi nào. Vấn đề của tôi là kết quả hợp nhất, nó thực sự nối các đối tượng được quản lý từ cả hai ngữ cảnh.
Thực thể của tôi là danh sách thuộc tính và mối quan hệ thực sự đơn giản.
Có thể hợp nhất cần một số hướng dẫn để hiểu khi nào một đối tượng được quản lý cập nhật KHÔNG PHẢI là một phiên bản mới, nhưng là phiên bản được chỉnh sửa của phiên bản đầu tiên. Tôi tưởng tượng rằng một nơi nào đó tôi cần xác định một cách để nhận diện một thực thể, (một thuộc tính ví dụ có thể hoạt động như một ID) và một cái gì đó giống như một chính sách hợp nhất (nếu 2 đối tượng được quản lý đại diện cho cùng một đối tượng, lấy một đối tượng với lastModificationDate gần đây hơn).
Tôi chỉ cần hiểu cách hợp nhất chính xác 2 ngữ cảnh để có một bản cập nhật duy nhất cho từng đối tượng.
CẬP NHẬT 1
Hiện tại vấn đề đã rõ ràng đối với tôi. Ngữ cảnh 2 có sự khác biệt lớn: ObjectID. Trong khi ngữ cảnh trên luồng chính tìm nạp ManagedObjects với điều phối viên Persistent Store, luồng thứ hai tạo ra các đối tượng đó bằng cách tìm nạp một URL từ xa. Ngay cả khi các đối tượng có cùng nội dung, chúng sẽ có 2 objectID khác nhau.
Đối tượng của tôi đã có một định danh duy nhất, tôi có thể sử dụng setObjectId để đặt giá trị này. (Tài liệu của Apple cho biết đây KHÔNG phải là ý hay).
Rõ ràng là các ID đối tượng khác nhau, vì bạn đang tạo các đối tượng thay vì tìm nạp chúng từ cửa hàng và cập nhật chúng. Đó là lý do tại sao tôi nói trong câu trả lời của tôi rằng bạn không cần bất cứ điều gì khác để kết hợp các đối tượng. Dù sao, cách thích hợp để xử lý tình huống này là sử dụng ID đối tượng được quản lý. Vì ID đối tượng được quản lý là chuỗi an toàn, bạn có thể chuyển chúng từ chuỗi chính của bạn đến chuỗi khác, sau đó sử dụng existingObjectWithID: error: để truy xuất đối tượng được liên kết với ID cụ thể, cập nhật và lưu ngữ cảnh. Bây giờ hợp nhất sẽ hoạt động như bạn mong đợi. –
Ngoài ra, nếu bạn không biết trước ID đối tượng được quản lý phải được truyền giữa các luồng, thì trong chủ đề khác, bạn chỉ cần tìm nạp các đối tượng bằng cách sử dụng vị từ để truy xuất các đối tượng tương ứng với các đối tượng được truy xuất từ máy chủ, sau đó bạn cập nhật và lưu ngữ cảnh. –
Chính xác! Vấn đề là objectIds. Bây giờ mỗi khi tôi thực hiện tìm nạp và tôi cần phải cập nhật một đối tượng hiện có, tôi lấy đối tượng từ cửa hàng và cập nhật nó. – Giuseppe