Trả lời

15

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.

+1

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

+2

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. –

0

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.

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