Nó không có giấy tờ nhưng quan sát hành vi trên cả OS X và iOS mà lưu được tính là một thay đổi cho toàn bộ NSManagedObject không chỉ các yếu tố khác nhau. Bạn có thể tìm thấy những càu nhàu về những hậu quả khác nhau của điều đó đối với các ràng buộc và những thứ tương tự xung quanh trang web này, trên openradar.appspot.com, v.v. Vấn đề đó cũng thể hiện với các tia lửa KVO rõ ràng là hoàn toàn không ngạc nhiên.
Cách đơn giản nhất để xử lý sự cố (tốt, đơn giản nhất sau khi 'chỉ hiển thị lại mọi thứ khi lưu' mà tôi thấy tùy chọn vượt qua đầu tiên cho đến khi ai đó than phiền) là lắng nghe thông báo chung chung, sau đó gọi -changedValues trên mỗi đã cập nhật đối tượng để chọn ra những đối tượng bạn quan tâm trong việc kích hoạt cập nhật cụ thể.
Nếu điều đó vô ích đối với trường hợp sử dụng của bạn, bạn có thể tạo accessors tùy chỉnh (mogenerator là một trợ giúp lớn với điều này) cho các thuộc tính của bạn thu thập trên cờ thread chỉnh sửa cho tất cả các thuộc tính mà bạn quan tâm; và gửi thông báo đó sau khi lưu.
Ví dụ: giả sử chúng tôi có a professional sports team app được cập nhật liên tục với nguồn cấp dữ liệu JSON được phân tích cú pháp trong nền. Tất cả các thuộc tính hiển thị ảnh hưởng của các nhóm, trình phát, trò chơi, v.v. NSManagedObject khác nhau có trình truy cập tùy chỉnh đặt cờ trong cấu trúc {playerStatsChanged, teamStatsChanged, leagueRankingsChanged, yadayadayadaChanged} tương ứng với các trang trong ứng dụng sẽ cần hiển thị lại khi tìm nạp hiện tại -and-parse thread hoàn thành. Sau đó, khi nó được lưu, nó sẽ tắt thông báo chung 'cập nhật các màn hình này' với cấu trúc thiết lập cờ đó. Bạn có thể kết hợp các thông báo đường dẫn thay đổi cá nhân vào một mức độ cao hơn 'cập nhật màn hình này' loại logic ở đâu đó trong mọi trường hợp, phải không? Vâng, ở cấp độ setter tài sản là khá nhiều điểm phí thấp nhất bạn có thể làm điều đó tại, cho các trường hợp sử dụng hợp lý nhất. Chắc chắn đối với bất kỳ thiết kế cập nhật định kỳ nào được tải xuống như ứng dụng nhóm thể thao của chúng tôi tại đây.
Nguồn
2013-07-10 22:22:32
Bạn xử lý thông báo như thế nào? Bạn nên xem NSUpdatedObjectsKey của từ điển userInfo thông báo. – random
Tôi đã triển khai phương thức này: - (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) thay đổi đối tượng: (NSDictionary *) thay đổi ngữ cảnh: (void *) context; – aloo
Bây giờ tôi có thể nhìn vào từ điển thay đổi và nhìn vào giá trị cũ để xem liệu giá trị của nó có thay đổi so với giá trị hiện tại hay không - nhưng tại sao tôi lại nhận được thông báo KVO ngay từ đầu nếu nsmanagedobject thậm chí không thay đổi cho keypath đã cho? – aloo