2011-08-12 10 views

Odpowiedz

15

Powiadomienia i KVO służą do podobnych funkcji, ale z różnymi kompromisami.

  • Powiadomienia są łatwe do zrozumienia. KVO jest ... trudne ... zrozumieć (przynajmniej zrozumieć, jak z niego korzystać oraz).

  • Powiadomienia wymagają modyfikacji obserwowanego kodu. Obserwowane musi jawnie generować każde powiadomienie, które oferuje. KVO jest przezroczysty dla obserwowanego kodu, o ile obserwowany kod jest zgodny z KVC (co i tak powinno być).

  • Powiadomienia mają narzut, nawet jeśli ich nie używasz. Za każdym razem, gdy zaobserwowany kod wysyła powiadomienie, musi być sprawdzony przed każdą obserwacją w systemie, nawet jeśli nikt nie obserwuje tego obiektu (nawet jeśli nikt niczego nie obserwuje). Może to być bardzo nietrywialne, jeśli w systemie jest więcej niż kilkaset obserwacji. Może to stanowić poważny problem, jeśli jest ich kilka tysięcy. KVO ma zero narzutów dla każdego obiektu, który nie jest faktycznie obserwowany.

Ogólnie rzecz biorąc, odradzam KVO z powodu pewnych konkretnych problemów związanych z wdrażaniem, które moim zdaniem utrudniają prawidłowe stosowanie. Trudno jest zaobserwować obiekt, który obserwuje również twoja superklasa bez specjalnej znajomości twojej superklasy. Jego silne uzależnienie od literałów smyczkowych sprawia, że ​​małe literówki są trudne do uchwycenia podczas kompilacji. Zasadniczo znajduję kod, który opiera się w dużej mierze na tym, że staje się on skomplikowany i trudny do odczytania, i zaczyna podnosić upiorne działania na odległość. Kod NSNotification wydaje się być bardziej bezpośredni i można zobaczyć, co się dzieje. Losowy kod działa nie tylko wtedy, gdy się go nie spodziewano.

Wszystko to powiedziawszy, KVO jest ważną cechą i programiści muszą to zrozumieć. Coraz więcej obiektów niskopoziomowych polega na tym, ponieważ ma zalety zerowego obciążenia. Ale dla nowych programistów zazwyczaj zalecam raczej poleganie na powiadomieniach niż na KVO.

Istnieje trzecia droga. Możesz zachować listę słuchaczy i wysyłać im wiadomości, gdy rzeczy się zmieniają, tak jak metody delegatów. Niektórzy nazywają to "delegatami multicastowymi", ale "słuchacze" są tutaj poprawniejsi, ponieważ nie modyfikują zachowania obiektu, tak jak robią to delegaci. Robienie tego w ten sposób może być znacznie szybsze niż NSNotification, jeśli potrzebujesz dużo obserwacji w systemie, bez dodawania złożoności KVO.

+0

Dzięki, Rob! > Powiadomienia mają narzut, nawet jeśli ich nie używasz. Za każdym razem, gdy obserwowany kod wysyła powiadomienie, musi być sprawdzany przed każdą obserwacją w systemie, nawet jeśli nikt nie obserwuje tego obiektu (nawet jeśli nikt niczego nie obserwuje). Nie można rozwiązać tego problemu z publikowaniem w różnych obiektach NSNotificationCenter? Nie można poprawić wydajności, nie jestem pewien –

+2

Tak, zarządzanie oddzielnymi NSNotificationCenters poprawi wydajność wyszukiwania. Wzorzec "słuchacza", który opisuję, jest w istocie ostateczną ewolucją tego, zasadniczo dając każdemu indywidualnemu obiektowi własne centrum powiadomień (co było implementacją, z którą początkowo grałem). Głównym problemem w wielu centrach powiadamiania jest to, że jest to nietypowy wzorzec i może wprowadzać w błąd innych programistów.Kiedy używają niewłaściwego centrum, po cichu nic nie robią i nie wiedzą dlaczego. Ale nie ma w tym nic złego. –

+0

Lepiej śledzić ten link: http://nshipster.com/nsnotification-and-nsnotificationcenter/ –

Powiązane problemy