2011-10-23 5 views
30

Chociaż mam pewne pojęcie, którego użyć, ale dokładne użycie nadal nie jest dla mnie jasne. Czy ktoś może wyjaśnić na przykładzie ...? Dzięki.KVO vs NSNotification kontra protokół/delegaci?

+3

Spróbuj tego przeczytać, to naprawdę ciekawy artykuł na blogu na ten temat, z punktu widzenia koderów. http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ – Daniel

Odpowiedz

36

Użyj delegata, jeśli chcesz rozmawiać tylko z jednym obiektem. Na przykład tableView ma delegata - tylko jeden obiekt powinien być odpowiedzialny za jego obsługę.

Użyj powiadomień, jeśli chcesz powiedzieć wszystkim, że coś się stało. Na przykład w sytuacjach z małą ilością pamięci wysyłane jest powiadomienie informujące twoją aplikację o ostrzeżeniu o pamięci. Ponieważ wiele obiektów w Twojej aplikacji może chcieć obniżyć zużycie pamięci, jest to powiadomienie.

Nie sądzę, że KVO jest dobrym pomysłem i staram się go nie używać, ale jeśli chcesz się dowiedzieć, czy dana nieruchomość się zmieniła, możesz wysłuchać zmian.

Nadzieję, że pomaga.

PS This sums up why I think KVO is broken

+4

Wiem, że to jest stare, ale nadal chcę się z tym nie zgodzić :) Ten artykuł sprawia, że ​​doskonałe punkty ponownie. dlaczego interfejs API KVO jest zepsuty, ale dokładnie stwierdza, że ​​wciąż jest potężnym narzędziem. Istnieje wiele sytuacji, w których można zapisać wiele brzydkich kodów. Użyj go w opakowaniu takim, jak ten, który podałeś, ale zrób to. – Shinigami

+0

Użyj KVO, gdy obserwatorzy potrzebują natychmiastowej odpowiedzi. I można nas NSNotifications, gdy obserwatorzy mogą czekać na pętli zdarzeń. – MANN

+0

@MANN Nie sądzę, że rozumiem - powiadomienia nie są asynchroniczne, są również natychmiastowo zwalniane (chociaż nie masz opcji zamiany w KVO) – deanWombourne

12

Zastosowanie delegatem gdy istnieje „master/slave” związek (delegat wie o klasie i klasa wie o delegata), o jedną klasę wyżej w hierarchii sterowania, a gdy jest to jasne, że nie będzie sytuacji, w których inne elementy (głównie interfejs użytkownika) będą zainteresowane wiedzą o tym, co klasa ma do powiedzenia. Korzystaj z powiadomień, gdy klasa nie jest zainteresowana wiedzą, kto słucha i ilu jest, każdy i każdy numer może zarejestrować się w powiadomieniach. KVO jest przydatne do słuchania "bez wiedzy klasowej", chociaż oczywiście tak nie jest, klasa, w której zastosowano KVO, nie musi być zmieniana.

2

Delegacja to wzorzec projektowy używany, gdy chcesz, aby jakiś inny obiekt zmodyfikował zachowanie nadawcy. Przykład: okna terminali unikają wyświetlania linii lub znaków przyciętych przez krawędzie okna, ponieważ okno dialogowe okna terminalu zmienia rozmiar okna, aby to zapewnić.

Powiadomienie to wzór do użycia, gdy nie potrzebujesz odpowiedzi. Przykład: otrzymujesz powiadomienie, że system zbliża się do snu. Nadawca powiadomienia nie dba o to, co z tym zrobisz.

1

Moim zdaniem KVO jest lepsze, ponieważ ma zerowe zalety. Powiadomienia mają narzut, nawet jeśli ich nie używasz/obserwujesz. Aby to poprawić, możesz korzystać z różnych NotificationCenters, ale nawet z pewnym obciążeniem (popraw mnie, jeśli się mylę). KVO jest mało złożone, ale warte swojej uwagi, gdy musisz obserwować wiele rzeczy.

+0

Ile, praktycznie rzecz biorąc, to koszty ogólne? – Liron

2

Nawet gdy wszystkie trzy będą służyć swoją potrzebę w sytuacji, delegat będzie nadal wolą opcja:

  1. MoŜliwość wykorzystania.
  2. Własny dokument. Badając plik nagłówkowy klasy, można od razu rozpoznać, co/jak wymiana danych odbywa się.