2013-06-11 15 views
17

Ich habe ungefähr mit der NSNotificationCenter gespielt und ich frage mich, wann Sie Ihre eigene benutzerdefinierte Benachrichtigungszentrale anstelle der defaultCenter verwenden würden? Und welche Vorteile hätte das?Wann muss ein benutzerdefiniertes NSNotificationCenter erstellt werden?

Verzeihen Sie meine Ignoranz, aber es scheint, als ob ich ganz glücklich mit dem defaultCenter und nichts weiter auskommen könnte, aber ich möchte sicherstellen, dass ich etwas wichtiges nicht vermisse.

+5

Legit Frage, ich habe immer * defaultCenter * ohne es zu kümmern. –

Antwort

11

Apple-Dokumentation ist vage, und es heißt nur, dass in der Regel würde ein Programmierer nicht neu erstellen müssen:

Jeder läuft Cocoa Programm verfügt über ein Standard-Benachrichtigungscenter. In der Regel erstellen Sie keine eigenen. Ein NSNotificationCenter-Objekt kann Benachrichtigungen nur innerhalb eines einzelnen Programms bereitstellen.

Volle Quelle: NSNotificationCenter documentation.

Jedes Benachrichtigungscenter kann jedoch ein Netzwerk von Benachrichtigungen verwalten, die sich nach Name und Objekt unterscheiden. Wenn Sie einen Beobachter hinzufügen rufen Sie in der Regel das Verfahren in irgendeiner Weise wie folgt aus:

[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject]; 

Und wenn Sie eine Benachrichtigung hinterlassen können Sie das Objekt angeben:

[center postNotificationName: @"observe" object: someObject]; 

Auf diese Weise sagen, dass man N-Namen verwenden und M-Objekte können Sie N * M Distinguished Notifications behandeln. Ich denke, es besteht keine Notwendigkeit, zwei Benachrichtigungszentren zu verwenden. Theoretisch, wenn Sie alle Namen beendet haben, können Sie einen anderen mit alloc + init erstellen, aber ich sehe kaum, wie es tatsächlich nützlich sein kann.

Denken Sie auch daran, dass das Benachrichtigungszentrum oft verwendet wird, wenn zwei Objekte keinen direkten Zeiger zueinander haben (sonst warum nicht einfach eine Methode aufrufen?), Um komplizierte Bindungen zu vermeiden (besonders wenn Sie sie verwenden) viele XIB-Dateien), so dass es sehr praktisch ist, ein einzigartiges Notification Center-Objekt zu haben.

Wenn Sie stattdessen ein Notification Center mit allot + init verwenden, müssen Sie sicherstellen, dass alle kommunizierenden Objekte einen Zeiger auf dieses Benachrichtigungszentrum haben, was zu einer gewissen Komplexität führen würde. Die gesamte Stromversorgung des Benachrichtigungszentrums wäre verschwendet.

8

Obwohl es in AppKit über den defaultCenter Singleton Accessor stark verwendet wird, ist NSNotificationCenter wirklich nur ein "generischer Entkopplungsmechanismus". Erlauben Sie Ihnen alloc/init Ihre eigenen Instanzen davon ist nur ein Ausdruck dieser Generic-Ness. Wenn Sie es für etwas anderes verwenden wollten, könnten Sie.

Um dies mit einem etwas absurden Beispiel zu veranschaulichen, denken Sie folgendermaßen vor: NSDocument verfügt über einen windowControllers Accessor, der eine spezifische, gesegnete, wichtige Instanz von NSArray zurückgibt, die Verweise auf alle für das Dokument spezifischen Fenstercontroller enthält. Das heißt, NSArray ist nur eine "generische Listendatenstruktur". Nur weil es diese spezielle Instanz mit einem bestimmten Zweck gibt, bedeutet das nicht, dass es nicht sinnvoll ist, NSArray für Ihre eigenen Zwecke wiederzuverwenden. Sowohl NSArray als auch NSNotificationCenter stellen generische Datenstrukturen/Bausteine ​​zur Verfügung, von denen bestimmte Instanzen in gesegneten "Berufen" rund um AppKit verwendet werden, die aber beide für sich alleine nützlich sein könnten.Der primäre Anwendungsfall, den ich beim Erstellen von Standalone-Instanzen von NSNotificationCenter gesehen habe, ist, wenn mehrere Instanzen eines komplexen Subsystems parallel in mehreren Threads ausgeführt werden sollen und diese nicht durch Cross-Thread-Benachrichtigungen verwirrt werden können. In diesem Fall besteht das allgemeine Muster darin, ein NSNotificationCenter pro Thread zuzuweisen. Dies unterteilt die Benachrichtigungen für jedes Netzwerk von Objekten in einen einzelnen Thread. Dies ist im Allgemeinen erforderlich, wenn Beobachter nil für den Objektparameter übergeben, der unabhängig von der Quelle alle Benachrichtigungen mit einem bestimmten Namen abhören soll.

All das gesagt, ich gebe zu, dass nach meiner Erfahrung, private Instanzen von NSNotificationCenter ist ziemlich selten.

Verwandte Themen