NSNotificationCenter vs Delegation (unter Verwendung von Protokollen)?

Antworten:

104

Als Faustregel gilt hier, wie viele Kunden über ein Ereignis benachrichtigt werden möchten. Wenn es sich hauptsächlich um ein Objekt handelt (z. B. um eine Ansicht zu schließen oder auf eine angeklickte Schaltfläche zu reagieren oder um auf einen fehlgeschlagenen Download zu reagieren), sollten Sie das Delegatenmodell verwenden.

Wenn das von Ihnen ausgegebene Ereignis für viele Objekte gleichzeitig von Interesse sein kann (z. B. Bildschirm gedreht, Speichernutzung, Benutzeranmeldung / -abmeldung), sollten Sie das verwenden NSNotificationCenter.

notnoop
quelle
28
Ich möchte auch hinzufügen, dass Benachrichtigungen nur in eine Richtung erfolgen (z. B. DidFireMissle), während ein Delegat erforderlich ist, wenn Sie Informationen zurückgeben müssen (z -(BOOL)shouldFireMissle. B. ).
Benzado
8
@benzado: Eigentlich können Sie ein Objekt zusammen mit einer Nachricht übergeben, die Empfänger ändern können. Sie müssen berücksichtigen, dass möglicherweise mehrere (oder null) Empfänger die Benachrichtigung verarbeiten, diese ist jedoch gültig.
Glenn Maynard
37

Ihre Zwecke sind unterschiedlich:

  • Die Benachrichtigung wird verwendet, um Nachrichten an möglicherweise mehrere vom Absender unbekannte Empfänger zu senden.

  • Die Delegierung wird verwendet, um Nachrichten an einen einzelnen bekannten Empfänger zu senden, der im Namen des Absenders handelt.

Mouviciel
quelle
12

Benachrichtigungen sind im Allgemeinen besser, um die Benutzeroberfläche über Änderungen zu informieren, die auch in anderen Threads auftreten. In der Dokumentation von Apple wird aus Gründen der Stabilität und Leistung nach Möglichkeit dringend davon abgeraten, Delegierte über Threads hinweg zu verwenden. Auf dem Mac empfehlen sie die Verwendung von Bindungen. Da sie jedoch auf dem iPhone nicht vorhanden sind, sind Benachrichtigungen wahrscheinlich die nächstbeste Wahl.

Shawn Craver
quelle
7

In Anbetracht der Leistung ist es eine gute Idee (Delegation besser für eine kleine Anzahl benachrichtigter Objekte, Benachrichtigungscenter besser für eine größere Anzahl von Objekten oder einen Profiler ausführen), aber ich denke, ein wichtigerer Faktor, da Sie über Objective-C und sprechen Wenn Sie weniger wahrscheinlich über die wirklich leistungsstarken Teile Ihrer Codebasis sprechen, die wahrscheinlich in C geschrieben sind, werden die Abhängigkeiten zwischen den Modulen zur Kompilierungszeit verringert.

Nichts hindert Sie daran, ein Array von Delegierten zu haben, anstatt nur einen einzelnen Delegierten.

Ich verwende NSNotificationCenter möglicherweise nur für den Status aller von mir erstellten Netzwerkstapelkomponenten und aller benutzerdefinierten Schnittstellen zur Überwachung des Gerätestatus. Für die meisten Kopplungen, die nicht mit dem globalen Status der App zu tun haben, ist es meiner Meinung nach in den meisten Fällen klarer, normale Schnittstellenverträge in Objective-C zu verwenden, und es ist für die Personen, die nach Ihnen kommen, einfacher zu verfolgen, als NSNotificationCenter zu verwenden. Tatsächlich habe ich NotificationCenter noch nie für meine eigenen benutzerdefinierten Ereignisse verwendet und bevorzuge die Verwendung von Delegaten, um das Verständnis des Codes durch eine andere Person zu erleichtern, die meinen Code liest.

Und schließlich haben Sie bei Benachrichtigungen an / von der Standard-API natürlich keine Wahl und müssen die beiden Methoden verwenden, die Apple für ein bestimmtes Ereignis vorschreibt.

martinr
quelle
6

Benachrichtigungen sind besser zum Entkoppeln von UI-Komponenten. Sie können jede Ansicht ohne Änderungen an Ihren Controllern oder Modellen anschließen. Auf jeden Fall besser für locker gekoppeltes Design.

Für die Leistung zwischen Delegierung und Benachrichtigung müssen Sie jedoch über die Häufigkeit des Anrufs nachdenken.

Die Delegierung ist möglicherweise besser für häufigere Ereignisse, Benachrichtigungen sind besser für weniger häufige Ereignisse, aber mehr Empfänger. Es liegt an der Projektion, was zu wählen ist.

COzkurt
quelle
3

Eine Option zwischen diesen beiden ist die Verwendung des Beobachtermusters ohne NSNotificationCenter. Schauen Sie sich hier meine Objective-C-Implementierung an .

Alejandro
quelle