Unterscheidet NSNotification die richtige Route, wenn ich typisierte Eigenschaften hinzufügen möchte?

8

Ich versuche, NSNotification zu unterklassen.

Apples Dokumente für NSNotification geben Folgendes an:

  

NSNotification ist ein Klassencluster ohne Instanzvariablen. So wie,   Sie müssen die Klasse NSNotification ableiten und die primitiven Methoden überschreiben    name , object und userInfo . Sie können einen beliebigen Initialisierer auswählen   Sie mögen, aber seien Sie sicher, dass Ihr Initialisierer nicht anruft    NSNotification Implementierung von init (via [super init] ).    NSNotification soll nicht direkt instanziiert werden und sein init   Methode löst eine Ausnahme aus.

Aber das ist mir nicht klar. Soll ich einen Initialisierer wie diesen erstellen?

%Vor%     
Undistraction 27.09.2011, 15:53
quelle

4 Antworten

14

Die Unterklasse NSNotification ist eine atypische Operation. Ich glaube, ich habe es in den letzten Jahren nur ein oder zwei Mal gesehen.

Wenn Sie die Informationen mit der Benachrichtigung weiterleiten möchten, ist dies die Eigenschaft userInfo . Wenn Sie nicht gerne direkt über userInfo auf Objekte zugreifen, können Sie eine Kategorie verwenden, um den Zugriff zu vereinfachen:

%Vor%

Sie können diesen Ansatz auch verwenden, um die Erstellung von NSNotification zu vereinfachen. Ihre Kategorie könnte beispielsweise auch Folgendes enthalten:

%Vor%

Wenn aus irgendeinem Grund die Eigenschaften veränderbar sein müssen, müssen Sie Assoziative Referenzen , um dies zu erreichen:

%Vor%     
Dave DeLong 28.09.2011, 16:28
quelle
2

Es scheint, dass das funktioniert. Zum Beispiel:

%Vor%

hüte dich auch vor einem massiven Gotcha, der sich auf NSNotifications bezieht. Der Typ von NSNotifications, der mit NSNotification notificationWithName: object: angegeben wurde, ist NSConcreteNotification, nicht NSNotification. Und um es ein bisschen schwieriger zu machen, wenn Sie nach einer Klasse suchen, NSConcreteNotification ist privat, Sie haben also nichts zu vergleichen.

    
Undistraction 27.09.2011 16:27
quelle
1

Sie legen es nicht genau fest - Sie überschreiben einfach die Implementierung der name -Methode, so dass sie zurückgibt, was Sie wollen. Mit anderen Worten:

%Vor%

Ihr Initialisierer sieht gut aus - ich habe kein Beispiel für init gesehen, das die Implementierung der Superklasse nicht vorher aufgerufen hat, aber wenn das das ist, was das Dokument sagt, sollten Sie es versuchen.

>     
Noah Witherspoon 27.09.2011 16:00
quelle
1

Sie können ein userInfo -Argument übergeben, wenn Sie eine Benachrichtigung senden. Warum nicht eine Payload erstellen und diese senden?

%Vor%

Fertig.

Als Nebenbemerkung: Ich habe im Laufe der Jahre herausgefunden, dass mein Code, der sich bewusst darum bemüht, Subklassen zu vermeiden, meinen Code sauberer, wartbarer, veränderbarer, testbarer und erweiterbarer gemacht hat. Wenn Sie das Problem mithilfe von Protokollen oder Kategorien lösen können, werden Sie sich nicht in das erste schäbige Design einklinken. Mit Swift 2.0-Protokollerweiterungen im Mix lachen wir auch wirklich.

    
Adam Waite 15.07.2015 11:05
quelle