Enviar y recibir mensajes a través de NSNotificationCenter en Objective-C?

Estoy tratando de enviar y recibir mensajes a través de NSNotificationCenter en Objective-C. sin Embargo, no he sido capaz de encontrar algunos ejemplos sobre cómo hacer esto. ¿Cómo enviar y recibir mensajes a través de NSNotificationCenter?

  • Realmente muy útil, gracias. Una cosa, el addObserver método no debería tener el trailing semi colon después de que el selector especificado (por lo menos se provocó una excepción en mi versión de este). He intentado editar el código anterior, pero el cambio no fue aceptado debido a problemas de formato en el código original.
  • Este fue un gran: cocoawithlove.com/2008/06/…
  • esto q es demasiado básico y amplio, un poco googleing habría sido buena
  • Esto es muy similar a una pregunta relacionada a continuación: stackoverflow.com/questions/7896646/…
  • Me parece absurdo que una pregunta como esta se cierra un no constructiva cuando los usuarios de Desbordamiento de Pila tienen tan claramente comentó su utilidad
  • En lugar de NSNotificationCenter, intente ObserversCenter: github.com/yonglam/ObserversCenter
  • Si usted está usando NSNotificationCenter te recomiendo el uso de la biblioteca github.com/AllinMobile/AIMObservers, que ayuda a evitar errores comunes

InformationsquelleAutor | 2010-02-03

6 Kommentare

  1. 1008
    @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

    … a otro lugar, en otra clase …

    - (void) someMethod
    {
    
        //All instances of TestClass will be notified
        [[NSNotificationCenter defaultCenter] 
            postNotificationName:@"TestNotification" 
            object:self];
    
    }
    • Sólo me preguntaba donde [NSNotificationCenter defaultCenter] está destinado a colocar. Es mejor colocarlo en el AppDelegate?
    • Depende, si usted está recibiendo o que la publicación de las notificaciones que potencialmente afectan a todas las partes de su aplicación, la puso en su AppDelegate. Si usted está recibiendo/publicación de las notificaciones que sólo afectan a una sola clase, la puso en que clase de lugar.
    • También, tenga en cuenta que «El método especificado por notificationSelector debe tener uno y solo un argumento (una instancia de NSNotification)». Inicialmente se supone que se podría proporcionar un selector sin un argumento, y renunciar al NSNotification.
    • La verdad, sin embargo vale la pena destacar debido a que esta pregunta es principalmente buscado por el nuevo ios devs que mantener la notificación de escucha de vida por más tiempo que el necesario. Ahora con arco que normalmente no lo uso dealloc y, como resultado, algunos pueden pensar que no tienen para liberar el oyente.
    • sueño, tal vez usted debería considerar también la posibilidad de añadir el ejemplo definitivo de un distrubuted notificación.
    • También podría ser vale la pena mencionar que el [super dealloc] llamada en la dealloc método no está permitida en virtud del ARCO; el resto está todo bien.
    • NB! si suponiendo multithread, a continuación, colocar removeObserver a dealloc no es tan buena idea. Aquí ejemplo sencillo para crash: lapcatsoftware.com/articles/…
    • Parece que todo lo que observador idea no cubre todos los casos. esto no funciona cuando la aplicación. estaba cerrado y un formulario de notificación la notificación de centro aprovechado. método de observador no consigue llamado.
    • ¿Qué pasaría si la notificación se activa y no hay observadores? Es la notificación perdido? O es «guardado» en un lugar listo para ser enviado a un nuevo observador (creado más tarde)?
    • Si no hay observadores, entonces no pasa nada, el NSNotification simplemente se descarta.
    • Me estoy enfrentando a un problema con el código. En mi simple aplicación, hay dos viewcontrollers. En la primera VC, me han dado un botón, que al pulsarlo se envía la ‘TestNotification’ y realiza un pase a la otra VC, que es el Observador en mi caso. He declarado el observador como yo en este y el resto, como es su código.El problema es el método de ‘receiveTestNotification’ no se llama a todos..! Ni siquiera una vez! No se llama de todos modos. Y he cruzado marcada con el código,así que no hay casi ninguna diferencia.Así que, ¿te importaría ayudarme o guía de manera adecuada.
    • Compruebe para asegurarse de que no son la publicación de la notificación de un subproceso en segundo plano. Usted puede actualizar la interfaz de usuario desde el hilo principal.
    • La notificación es enviada desde el hilo principal; cuando se pulsa el botón de un IBAction se llama en donde puedo publicar la notificación y realizar la transición a partir de entonces en el mismo método. El código de donde yo soy la publicación de la Notificación es: [[NSNotificationCenter defaultCenter] postNotificationName:@»TestNotification» objeto:[[ObserverViewController alloc] init]];
    • También probé esto: [[NSNotificationCenter defaultCenter] postNotificationName:@»TestNotification» objeto:auto]; Pero mis esfuerzos fueron en vano.
    • Para evitar el mensaje «ARCO prohíbe enviar mensaje explícito de ‘dealloc’ » acaba de quitar la invocación a su clase super[super dealloc], como: -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } también agregar el observador a la cola principal para evitar más problemas.

  2. 223

    Para ampliar dreamlax el ejemplo de… Si desea enviar los datos junto con la notificación

    De publicación código:

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

    En la observación de código:

    - (void) receiveTestNotification:(NSNotification *) notification {
    
        NSDictionary *userInfo = notification.userInfo;
        MyObject *myObject = [userInfo objectForKey:@"someKey"];
    }
    • TestNotification debe ser de tipo NSString. Es una variable de instancia NSNotification?
    • Puedo acceder observador self en receiveTestNotification método ?
    • ¿por qué – Sí. receiveTestNotification es un método de instancia, y que dispone de acceso a la instancia de sí misma a través de sí mismo dentro de ella.
    • Eso es todo. Yo estaba buscando una manera de obtener la información de usuario del receptor método.
    • Parece que todo lo que observador idea no cubre todos los casos. esto no funciona cuando la aplicación. estaba cerrado y un formulario de notificación la notificación de centro aprovechado. método de observador no consigue llamado.
    • Yo ya se hacer todo eso. Quiero saber la mejor manera para abrir el controlador de vista. Yo soy la mejora de código ahora. Me pueden volver a aquí con una pregunta cuando yo termine.
    • Hey amigo me puedes decir ¿cuál es el uso de <objeto> argumento en la adición de un observador o de la publicación de una notificación, ya que uno puede pasar de la fecha en userinfo
    • Yo nunca he usado el <objeto> argumento. A partir de la documentación que se describe como «El objeto de la publicación de la notificación.» Que puede ser útil si hay varios objetos fueron la publicación de la misma notificación y usted necesita tomar acción diferente sobre la base de donde se originó. developer.apple.com/library/mac/documentation/Cocoa/Reference/…
    • podría publicar un poco más el código que usted está teniendo un problema con el y detalles sobre el error que se obtiene?

  3. 48

    Este me ayudó:

    //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"); 
    }

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

  4. 48

    También existe la posibilidad de utilizar bloques:

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

    La documentación de Apple

    • Esta es una buena actualización a mi respuesta que es bastante anticuados. Con la introducción o el ARCO y bloques, la notificación de los centros son mucho más fáciles de tratar.
    • Yo también lo creía, pero resulta que es demasiado bueno para ser verdad. En este caso, usted tiene que retener el observador que addObserver devuelve y luego en quitar eso, lo que hace que sea tan complicado como la creación de un nuevo método, si no más. Más info: toastmo.com/blog/2012/12/04/…
  5. 41

    si usted está usando NSNotificationCenter para la actualización de su punto de vista, no te olvides de enviar desde el hilo principal llamando dispatch_async:

    dispatch_async(dispatch_get_main_queue(),^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:nil];
    });
    • es la notificación de correos que debe ocurrir desde el hilo principal, o simplemente cuando en realidad la actualización de la vista, es decir, dentro del método de recepción de la notificación de despacho, para el hilo principal?
    • el hilo de enviar la notificación es el hilo de ejecución de las funciones, y por lo tanto tratando de cambiar la interfaz de usuario. también puede utilizar el envío al hilo principal dentro de las funciones, al igual que usted dijo:D. debe tener el mismo resultado, perheps es aún mejor:D
    • muchas gracias bro, se trabajó sólo después de que escribí en el interior de dispatch_async
  6. 0

    SWIFT 5.1 de la respuesta seleccionada para los novatos

    class TestClass {
        deinit {
            //If you don't remove yourself as an observer, the Notification Center
            //will continue to try and send notification objects to the deallocated
            //object.
            NotificationCenter.default.removeObserver(self)
        }
    
        init() {
            super.init()
    
            //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.
    
            NotificationCenter.default.addObserver(self, selector: #selector(receiveTest(_:)), name: NSNotification.Name("TestNotification"), object: nil)
        }
    
        @objc func receiveTest(_ notification: Notification?) {
            //[notification name] should always be @"TestNotification"
            //unless you use this method for observation of other notifications
            //as well.
    
            if notification?.name.isEqual(toString: "TestNotification") != nil {
                print("Successfully received the test notification!")
            }
        }
    }

    … a otro lugar, en otra clase …

     func someMethod(){
            //All instances of TestClass will be notified
            NotificationCenter.default.post(name: "TestNotification", object: self)
     }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...