74 Stimmen

Wie man die Objekteigenschaft von NSNotificationCenter verwendet

Könnte mir jemand bitte zeigen, wie man die object-Eigenschaft in NSNotificationCenter verwendet? Ich möchte sie verwenden, um einen Integer-Wert an meine Selektormethode zu übergeben.

So habe ich den Benachrichtigungslistener in meiner UI-Ansicht eingerichtet. Da ich möchte, dass ein Integer-Wert übergeben wird, bin ich mir nicht sicher, was nil ersetzen soll.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent:) name=@"myevent" object=nil];

- (void)receiveEvent:(NSNotification *)notification {
    // Event behandeln
    NSLog(@"Event erhalten %@", notification);
}

Ich versende die Benachrichtigung von einer anderen Klasse aus auf diese Weise. Die Funktion wird mit einer Variable namens Index übergeben. Dies ist der Wert, den ich irgendwie mit der Benachrichtigung auslösen möchte.

-(void) disptachFunction:(int) index
{
    int pass= (int)index;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass];
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#>   object:<#(id)anObject#>
}

107voto

gavinb Punkte 18143

Der object-Parameter stellt den Absender der Benachrichtigung dar, der normalerweise self ist.

Wenn Sie zusätzliche Informationen übermitteln möchten, müssen Sie die Methode postNotificationName:object:userInfo: von NSNotificationCenter verwenden, die ein beliebiges Wörterbuch von Werten akzeptiert (die Sie frei definieren können). Der Inhalt muss tatsächliche Instanzen von NSObject sein, nicht ein integraler Typ wie zum Beispiel ein Integer, daher müssen die Integer-Werte mit NSNumber-Objekten umschlossen werden.

NSDictionary* dict = [NSDictionary dictionaryWithObject:
                         [NSNumber numberWithInt:index]
                      forKey:@"index"];

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent"
                                      object:self
                                      userInfo:dict];

0 Stimmen

Ich habe mich für deine Option entschieden. Das einzige zusätzliche, was ich tun musste, war, einen Automatischen Pool um das Wörterbuch zu packen.

3 Stimmen

(Oh, und meine Lösung ist die gleiche wie Matthews, ich habe es einfach geschafft, etwas schneller auf Absenden zu klicken!)

1 Stimmen

Wenn Sie sagen "ein Autorelease-Pool um das Dictionary wickeln", meinen Sie, dass Sie einen Aufruf hinzugefügt haben, um das Dict zu autorelaisen, oder haben Sie tatsächlich ein NSAutoreleasePool-Objekt erstellt? Letzteres ist nicht notwendig, es sei denn, Sie befinden sich auf einem sekundären Thread, und Ersteres ist nicht erforderlich für Klasseninitialisierer dieser Form, da es sich nicht um init oder new handelt.

84voto

Matthew Frederick Punkte 22117

Die object-Eigenschaft ist dafür nicht geeignet. Sie möchten stattdessen den userinfo-Parameter verwenden:

+ (id)notificationWithName:(NSString *)aName 
                    object:(id)anObject 
                  userInfo:(NSDictionary *)userInfo

userInfo ist, wie Sie sehen können, ein NSDictionary, das speziell zum Senden von Informationen zusammen mit der Benachrichtigung dient.

Ihre Methode dispatchFunction würde stattdessen so aussehen:

- (void) disptachFunction:(int) index {
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"];
   [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo];
}

Ihre Methode receiveEvent würde so aussehen:

- (void)receiveEvent:(NSNotification *)notification {
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue];
}

0 Stimmen

"Das Objekteigenschaft ist nicht dafür geeignet." Warum ist es nicht geeignet? Wie auch immer, wenn ich versuche, die Objekteigenschaft zu verwenden, um beispielsweise ein NSString* zu übergeben. Was wird passieren?

1 Stimmen

@Selvin Es ist zum Senden des Objekts, das die Benachrichtigung postet (du würdest es auf self setzen, wenn du es verwenden möchtest). Was passiert, wenn du etwas anderes dort hineinsetzt? Ich habe keine Ahnung, aber wenn ich raten müsste, könnte es Dinge durcheinander bringen, die unter der Oberfläche passieren, wie die Notification Center, das verfolgt, was freigegeben werden muss. Warum das riskieren, wenn es ein tatsächliches System zum Weitergeben von Objekten gibt?

3 Stimmen

"Ein NSNotification-Objekt (auch Benachrichtigung genannt) enthält einen Namen, ein Objekt und optional ein Dictionary. Der Name ist ein Tag zur Identifizierung der Benachrichtigung. Das Objekt ist ein beliebiges Objekt, das der Absender der Benachrichtigung an Beobachter dieser Benachrichtigung senden möchte - in der Regel das Objekt, das die Benachrichtigung selbst veröffentlicht hat. Das Dictionary kann zusätzliche Informationen über das Ereignis enthalten." Klingt für mich, als wäre es vollkommen in Ordnung, etwas anderes als self und nil in object: zu setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X