629 Stimmen

Senden und Empfangen von Nachrichten über NSNotificationCenter in Objective-C?

Ich versuche, Nachrichten zu senden und zu empfangen über NSNotificationCenter in Objective-C. Ich habe jedoch keine Beispiele dafür gefunden, wie man das macht. Wie senden und empfangen Sie Nachrichten über NSNotificationCenter ?

0 Stimmen

Wirklich sehr nützlich, danke. Eine Sache, die addObserver-Methode sollte nicht den abschließenden Doppelpunkt nach dem angegebenen Selektor haben (zumindest verursachte es eine Ausnahme in meiner Version von diesem). Ich habe versucht, den Code oben zu bearbeiten, aber die Änderung wurde aufgrund von Formatierungsproblemen im ursprünglichen Code nicht akzeptiert.

3 Stimmen

Das war großartig: cocoawithlove.com/2008/06/

2 Stimmen

Diese Frage ist viel zu einfach und breit gefächert, ein bisschen googeln wäre gut gewesen

1041voto

dreamlax Punkte 91447
@implementation TestClass

- (void) dealloc
{
    // If you don't remove yourself as an observer, the Notification Center
    // will continue to try and send notification objects to the deallocated
    // object.
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

- (id) init
{
    self = [super init];
    if (!self) return nil;

    // Add this instance of TestClass as an observer of the TestNotification.
    // We tell the notification center to inform us of "TestNotification"
    // notifications using the receiveTestNotification: selector. By
    // specifying object:nil, we tell the notification center that we are not
    // interested in who posted the notification. If you provided an actual
    // object rather than nil, the notification center will only notify you
    // when the notification was posted by that particular object.

    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveTestNotification:) 
        name:@"TestNotification"
        object:nil];

    return self;
}

- (void) receiveTestNotification:(NSNotification *) notification
{
    // [notification name] should always be @"TestNotification"
    // unless you use this method for observation of other notifications
    // as well.

    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

@end

... irgendwo anders in einer anderen Klasse ...

- (void) someMethod
{

    // All instances of TestClass will be notified
    [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"TestNotification" 
        object:self];

}

2 Stimmen

Ich frage mich nur, wo [NSNotificationCenter defaultCenter] platziert werden soll. Ist es am besten, es in Ihrem AppDelegate zu platzieren?

15 Stimmen

@Fulvio: Es kommt darauf an, ob Sie Benachrichtigungen empfangen oder veröffentlichen, die möglicherweise alle Teile Ihrer Anwendung betreffen, legen Sie sie in Ihr AppDelegate. Wenn Sie Benachrichtigungen empfangen/veröffentlichen, die nur eine einzelne Klasse betreffen, legen Sie sie stattdessen in dieser Klasse ab.

0 Stimmen

Außerdem ist zu beachten, dass "die von notificationSelector angegebene Methode nur ein einziges Argument (eine Instanz von NSNotification) haben darf". Ursprünglich nahm ich an, dass Sie einen Selektor ohne ein Argument bereitstellen und auf die NSNotification verzichten könnten.

236voto

Michael Peterson Punkte 9656

Zur Erweiterung der dreamlax's Beispiel ... Wenn Sie Daten zusammen mit der Benachrichtigung senden möchten

Im Buchungscode:

NSDictionary *userInfo = 
[NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: 
                       @"TestNotification" object:nil userInfo:userInfo];

Bei der Einhaltung des Codes:

- (void) receiveTestNotification:(NSNotification *) notification {

    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}

0 Stimmen

TestNotification muss vom Typ NSString sein. Ist es eine Instanzvariable NSNotification?

1 Stimmen

Kann ich auf den Beobachter zugreifen? self in der Methode receiveTestNotification ?

0 Stimmen

Warum - Ja. receiveTestNotification ist eine Instanzmethode, und Sie haben über self innerhalb der Methode Zugriff auf die Instanz selbst.

52voto

j7nn7k Punkte 16569

Das hier hat mir geholfen:

// Add an observer that will respond to loginComplete
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(showMainMenu:) 
                                                 name:@"loginComplete" object:nil];

// Post a notification to loginComplete
[[NSNotificationCenter defaultCenter] postNotificationName:@"loginComplete" object:nil];

// the function specified in the same class where we defined the addObserver
- (void)showMainMenu:(NSNotification *)note {
    NSLog(@"Received Notification - Someone seems to have logged in"); 
}

Quelle: http://www.smipple.net/snippet/Sounden/Simple%20NSNotificationCenter%20example

51voto

Xavi Gil Punkte 11102

Es besteht auch die Möglichkeit, Blöcke zu verwenden:

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] 
     addObserverForName:@"notificationName" 
     object:nil
     queue:mainQueue
     usingBlock:^(NSNotification *notification)
     {
          NSLog(@"Notification received!");
          NSDictionary *userInfo = notification.userInfo;

          // ...
     }];

Apples Dokumentation

1 Stimmen

Dies ist ein gutes Update zu meiner Antwort, die inzwischen ziemlich veraltet ist. Mit der Einführung von ARC und Blöcken sind die Benachrichtigungszentralen viel einfacher zu handhaben.

5 Stimmen

Das dachte ich auch, aber es stellt sich heraus, dass es zu schön ist, um wahr zu sein. In diesem Fall muss man den Beobachter, den addObserver zurückgibt, beibehalten und später wieder entfernen, was es genauso kompliziert macht wie das Erstellen einer neuen Methode, wenn nicht sogar noch komplizierter. Mehr Informationen: toastmo.com/blog/2012/12/04/

43voto

eiran Punkte 1380

Wenn Sie NSNotificationCenter für die Aktualisierung Ihrer Ansicht verwenden, vergessen Sie nicht, es vom Hauptthread aus zu senden, indem Sie dispatch_async :

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:nil];
});

1 Stimmen

Ist es die Benachrichtigung Post, die aus dem Haupt-Thread auftreten muss, oder nur, wenn Sie tatsächlich die Ansicht aktualisieren, d. h. innerhalb der Methode, die die Benachrichtigung erhalten Sie an den Haupt-Thread senden?

1 Stimmen

Der Thread, von dem aus Sie die Benachrichtigung senden, ist der Thread, der die Funktionen ausführt und somit versucht, die Benutzeroberfläche zu ändern. Sie können auch die Weiterleitung an den Hauptthread innerhalb der Funktionen verwenden, genau wie Sie gesagt haben:D. Das sollte dasselbe Ergebnis haben, vielleicht ist es sogar besser:D

1 Stimmen

@eiran, vielen Dank, Bruder, es funktionierte nur, nachdem ich innerhalb dispatch_async schrieb

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