2011-10-23 34 views
30

Mặc dù tôi có một số ý tưởng sử dụng khi nào nhưng việc sử dụng chính xác vẫn chưa rõ ràng đối với tôi. Ai đó có thể giải thích bằng ví dụ ...? Cảm ơn.KVO vs NSNotification so với giao thức/đại biểu?

+3

Hãy thử đọc bài viết này, đây là một bài viết trên blog thực sự thú vị về chủ đề cho quan điểm lập trình viên. http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ – Daniel

Trả lời

36

Sử dụng đại biểu nếu bạn chỉ muốn nói chuyện với một đối tượng. Ví dụ, một tableView có một delegate - chỉ một đối tượng phải chịu trách nhiệm đối phó với nó.

Sử dụng thông báo nếu bạn muốn thông báo cho mọi người biết điều gì đó đã xảy ra. Ví dụ trong các tình huống bộ nhớ thấp, một thông báo được gửi cho ứng dụng của bạn biết rằng đã có cảnh báo bộ nhớ. Bởi vì rất nhiều đối tượng trong ứng dụng của bạn có thể muốn giảm mức sử dụng bộ nhớ của nó, đó là thông báo.

Tôi không nghĩ KVO là một ý tưởng hay và cố gắng không sử dụng nó, nhưng nếu bạn muốn tìm hiểu xem tài sản có thay đổi hay không, bạn có thể nghe thay đổi.

Hy vọng điều đó sẽ hữu ích.

PS This sums up why I think KVO is broken

+4

Tôi biết điều này là cũ, nhưng tôi vẫn muốn không đồng ý với nó :) Bài viết đó làm cho điểm tuyệt vời lại. lý do tại sao các KVO API bị hỏng, nhưng nó cũng chính xác nói rằng nó vẫn là một công cụ mạnh mẽ. Có rất nhiều tình huống mà nó có thể tiết kiệm rất nhiều mã xấu xí. Sử dụng nó với một wrapper như một trong những ông đã cung cấp nếu bạn thích, nhưng sử dụng nó. – Shinigami

+0

Sử dụng KVO khi người quan sát cần phản ứng ngay lập tức. Và chúng ta có thể NSNotifications khi các nhà quan sát có thể chờ đợi cho vòng lặp sự kiện. – MANN

+0

@MANN Tôi không nghĩ rằng tôi hiểu - thông báo không đồng bộ, chúng cũng được kích hoạt ngay lập tức (mặc dù bạn không nhận được các tùy chọn willChange bạn nhận được với KVO) – deanWombourne

12

Sử dụng một đại biểu khi có một "master/slave" mối quan hệ (đại biểu biết về lớp và lớp biết về các đại biểu), với một lớp cao hơn hệ thống phân cấp quản lý, và khi nó là rõ ràng rằng sẽ không có tình huống mà các yếu tố khác (chủ yếu là UI) sẽ quan tâm đến việc biết những gì lớp học đã nói. Sử dụng thông báo khi lớp học không quan tâm đến việc biết ai lắng nghe và số lượng họ đang nghe, bất kỳ ai và bất kỳ số nào đều có thể đăng ký nhận thông báo. KVO rất hữu ích khi nghe "mà không có lớp biết", mặc dù tất nhiên đó không phải là trường hợp, lớp mà KVO được áp dụng không cần phải thay đổi.

2

Ủy quyền là mẫu thiết kế mà bạn sử dụng khi bạn muốn một số đối tượng khác sửa đổi hành vi của người gửi. Ví dụ: cửa sổ đầu cuối tránh hiển thị bất kỳ dòng hoặc ký tự nào được cắt bớt bởi các cạnh của cửa sổ, bởi vì ủy nhiệm của cửa sổ đầu cuối thay đổi kích thước của cửa sổ để đảm bảo điều này.

Thông báo là mẫu để sử dụng khi bạn không cần phản hồi. Ví dụ: bạn nhận được thông báo rằng hệ thống sắp chuyển sang chế độ ngủ. Người gửi thông báo đó không quan tâm bạn làm gì với thông báo đó.

1

Theo ý kiến ​​của tôi, KVO tốt hơn vì đó là lợi thế không có phí. Thông báo có phí ngay cả khi bạn không sử dụng/quan sát chúng. Để cải thiện mà bạn có thể sử dụng NotificationCenters khác nhau nhưng ngay cả với một số chi phí sẽ có (sửa chữa cho tôi nếu tôi sai). KVO có chút phức tạp nhưng đáng giá khi bạn phải quan sát rất nhiều thứ.

+0

Bao nhiêu, thực tế nói, là chi phí? – Liron

2

Ngay cả khi tất cả ba sẽ phục vụ nhu cầu của bạn trong một tình huống, đại biểu sẽ vẫn là một lựa chọn thích:

  1. Reuseability.
  2. Tự ghi nhận. Bằng cách kiểm tra tập tin tiêu đề của lớp, người ta sẽ ngay lập tức nhận ra những gì/làm thế nào dữ liệu trao đổi lấy địa điểm.
Các vấn đề liên quan