Tôi tự hỏi liệu có một lý do nào đó để sử dụng cái kia trong quan sát KVO và NSNotificationCenter. Hiệu suất, sử dụng bộ nhớ, tốc độ, vv?Quan sát KVO và NSNotificationTrung tâm quan sát
Trả lời
Cả hai không phải lúc nào cũng có thể hoán đổi cho nhau. Về mặt khái niệm, KVO chỉ để quan sát một thuộc tính của một đối tượng. Ví dụ, bạn không thể sử dụng KVO để thay thế NSApplicationWillTerminateNotification
vì nó thông báo cho người quan sát về một sự kiện đang diễn ra, chứ không phải thay đổi trong thuộc tính của một đối tượng.
Về hiệu suất và mức sử dụng bộ nhớ, chúng đều nhanh và sử dụng bộ nhớ không đáng kể. NSNotificationQueue
đã kết hợp để ngăn chặn lũ lụt của thông báo. KVO không có bất kỳ sự kết hợp nào mà tôi biết, điều này đã gây ra vấn đề về hiệu suất cho tôi tại một thời điểm. Tôi đã quan sát hàng trăm đối tượng và khi cập nhật hàng loạt xảy ra với những đối tượng đó, tôi sẽ nhận được hàng trăm cuộc gọi lại của KVO. Nó không phải là một vấn đề hiệu suất với KVO chính nó, nhưng với mã của riêng tôi đang chạy như là kết quả của việc cập nhật hàng loạt.
Hiệu suất không thực sự là vấn đề, đó là vấn đề phù hợp nhất cho vấn đề. Nếu đó là thay đổi thuộc tính, hãy sử dụng KVO. Nếu nó không phải là một thay đổi tài sản, sử dụng một đại biểu hoặc một thông báo tùy thuộc vào việc bạn cần một quan sát viên duy nhất hoặc nhiều quan sát viên.
Câu hỏi rất cũ, nhưng nghĩ đến việc thêm một số điểm. Tuy nhiên, tôi đồng ý với Tom Dalling's answer, có nhiều trường hợp trong các ứng dụng lớn, nơi chúng tôi có xu hướng thêm người quan sát đối với thuộc tính của đối tượng và chúng tôi không thể xóa chúng khỏi danh sách người quan sát.
Hãy để chúng tôi xem xét kịch bản sau đây từ ứng dụng của tôi - Một ViewController hiển thị một đối tượng con rắn, tôi đang quan sát sự thay đổi thuộc tính đối tượng này - "nọc độc". Vì vậy, bất cứ khi nào viewController cần thiết để hiển thị một con rắn khác, tôi chỉ đơn giản là sẽ loại bỏ bộ điều khiển xem từ người quan sát của đối tượng con rắn đó.
Ứng dụng đã phát triển để hiển thị danh sách các loài rắn thay vì một con rắn duy nhất, điều này có nghĩa là tôi phải quan sát đặc tính của tất cả các con rắn trong đối tượng đó. Bây giờ, khi một con rắn cũ được lấy ra khỏi mảng, tôi sẽ nhận biết về sự kiện này để tôi có thể loại bỏ bộ điều khiển xem như người quan sát từ đối tượng con rắn này. Để làm điều này, trước tiên tôi phải quan sát các thay đổi trên chính mảng đó. Để làm điều này tôi phải làm theo giao thức cụ thể để chèn các đối tượng vào mảng và loại bỏ chúng khỏi mảng. Bằng cách này, sự phức tạp xây dựng trên. Chúng ta đều biết hậu quả của việc không loại bỏ người quan sát khỏi một đối tượng và nếu đối tượng đó được hệ điều hành phát hành!
Trên đây là chỉ là một ví dụ để trích dẫn, vấn đề chính ở đây là tôi không thể có được danh sách các nhà quan sát KVO cho một đối tượng nhất định để loại bỏ chúng từ các nhà quan sát trước khi đối tượng này được phát hành - Đây có thể dễ dàng đạt được bằng cách NSNotification và NSNotificationCenter. Đôi khi, tôi có khuynh hướng nghiêng về hướng sử dụng NSNotification trên KVO, tuy nhiên, KVO luôn có thông báo về khía cạnh thực hành thiết kế tốt.
- 1. Quan sát/Quan sát Android
- 2. KnockoutJS - Dải quan sát của các đối tượng quan sát
- 3. Có thể quan sát-invisibleRect
- 4. .net Quan sát 'Quan sát' một chủ đề nền
- 5. dùng Ember của "quan sát (..)" để quan sát thay đổi của một số mảng
- 6. Di NSNotificationCenter quan sát
- 7. Mẫu thiết kế quan sát - Các đối tượng và quan sát bê tông
- 8. Máy quan sát và Quan sát Java không hoạt động đúng cách giữa các ứng dụng
- 9. Quan sát các thay đổi đối với mảng có thể thay đổi bằng KVO và NSNotificationCenter
- 10. Số quan sát trong NSMutableArray
- 11. Reactive Quan sát Subscription Xử
- 12. Mẫu quan sát đa luồng
- 13. Quan sát tự trong Cocoa
- 14. Key-Value Quan sát một NSMutableSet
- 15. Cách thực hiện Knockout các đối tượng quan sát được bên trong dãy quan sát
- 16. Quan sát các thuộc tính của một mảng đang được quan sát trong KnockoutJS
- 17. Theo dõi số quan sát viên (số lượng) trong một Quan sát?
- 18. Ví dụ siêu đơn giản về quan sát C#/quan sát được với các đại biểu
- 19. Knockout.JS Thay đổi mảng quan sát đối với các mục có thể quan sát riêng lẻ
- 20. KVO - Cách kiểm tra xem đối tượng có phải là người quan sát không?
- 21. Các nhà quan sát đường ray - Khi nào và khi nào không sử dụng các nhà quan sát trong Rails
- 22. mẫu quan sát viên vs MVC
- 23. Mẫu quan sát viên trong Oracle
- 24. Quan sát sự thay đổi trong python
- 25. Mẫu thiết kế quan sát trong C++
- 26. Quan sát có đáng giá không?
- 27. postNotificationName không gọi phương pháp quan sát
- 28. Mẫu quan sát bằng ngôn ngữ Go
- 29. Quan sát các thay đổi NSMutableDictionary
- 30. CDI - Sự kiện quan sát vùng chứa
Ah. Không biết về tổng hợp thông báo. Đó là một điều khá quan trọng đối với tôi. – David
Thông báo được sử dụng tốt nhất khi không cần một đối tượng để biết về một số đối tượng cụ thể khác. Ví dụ, bạn có thể muốn làm mới một loạt các khung nhìn nếu một số thiết lập thay đổi trong ứng dụng của bạn và thông báo rằng các khung nhìn đó không phải có bất kỳ kiến thức nào về đối tượng quản lý các thiết lập, trong đó bảo tồn MVC. –