Was ist der Unterschied zwischen NSNotificationCenter und der Key Value Observing Technik?

8

Ich habe gerade ein paar Tutorials über KVO gelesen, aber ich habe den Grund seiner Existenz noch nicht entdeckt. Ist NSNotificationCenter nicht eine einfachere Art Objekte zu beobachten?

Ich bin neu bei Stackoverflow, also sag mir einfach, ob etwas falsch ist, wenn ich diese Frage stelle!

    
Erik Wegener 12.08.2011, 13:25
quelle

1 Antwort

15

Benachrichtigungen und KVO dienen ähnlichen Funktionen, aber mit unterschiedlichen Kompromissen.

  • Benachrichtigungen sind einfach zu verstehen. KVO ist ... herausfordernd ... zu verstehen (zumindest zu verstehen, wie man es benutzt gut ).

  • Benachrichtigungen erfordern eine Änderung des beobachteten Codes. Das Beobachtete muss explizit jede Benachrichtigung generieren, die es anbietet. KVO ist für den beobachteten Code transparent, solange der beobachtete Code KVC entspricht (was er ohnehin tun sollte).

  • Benachrichtigungen haben Overhead, selbst wenn Sie sie nicht verwenden. Jedes Mal, wenn der beobachtete Code eine Benachrichtigung sendet, muss er gegen jede Beobachtung im System geprüft werden, selbst wenn niemand dieses Objekt beobachtet (auch wenn niemand etwas beobachtet). Dies kann sehr trivial sein, wenn mehr als ein paar hundert Beobachtungen im System vorhanden sind. Es kann ein ernstes Problem sein, wenn es ein paar Tausend gibt. KVO hat keinen Overhead für jedes Objekt, das nicht wirklich beobachtet wird.

Im Allgemeinen entmutige ich KVO wegen einiger spezifischer Implementierungsprobleme, von denen ich glaube, dass sie schwierig zu verwenden sind. Es ist schwierig, ein Objekt zu beobachten, das deine Oberklasse auch ohne spezielle Kenntnisse deiner Oberklasse beobachtet. Durch die starke Abhängigkeit von Zeichenfolgenliteralen können kleine Typos zur Kompilierungszeit kaum gefunden werden. Im Allgemeinen finde ich Code, der stark darauf angewiesen ist, wird komplex und schwer zu lesen, und fängt an, Spooky-Action-bei-einem-Abstand Bugs aufzunehmen. NSNotification Code neigt dazu, einfacher zu sein, und Sie können sehen, was passiert. Zufallscode wird nicht nur ausgeführt, wenn Sie es nicht erwartet haben.

Alles in allem ist KVO ein wichtiges Feature und Entwickler müssen es verstehen. Immer mehr Low-Level-Objekte vertrauen darauf, weil sie keine Overhead-Vorteile bieten. Aber für neue Entwickler empfehle ich normalerweise, dass sie eher auf Benachrichtigungen als auf KVO angewiesen sind.

Es gibt einen dritten Weg. Sie können eine Liste der Listener erstellen und ihnen Nachrichten senden, wenn sich die Dinge ändern, genau wie Delegate-Methoden. Manche Leute nennen diese "Multicast-Delegaten", aber "Listener" sind hier korrekter, weil sie das Verhalten des Objekts nicht wie ein Delegat ändern. Dies kann drastisch schneller sein als NSNotification , wenn Sie viel Beobachtung in einem System benötigen, ohne die Komplexität von KVO hinzuzufügen.

    
Rob Napier 12.08.2011, 13:50
quelle