observer objective notification example cocoa nsnotificationcenter

cocoa - objective - swift 4 notificationcenter



¿Cuándo crear un NSNotificationCenter personalizado? (2)

He estado jugando con el NSNotificationCenter y me pregunto cuándo usaría su propio centro de notificaciones personalizado en lugar del centro defaultCenter . ¿Y cuáles serían las ventajas de esto?

Perdone mi ignorancia, pero parece que podría defaultCenter muy bien con solo usar el defaultCenter y nada más, pero quiero asegurarme de que no me esté perdiendo algo vital.


Aunque se usa mucho en AppKit a través del defaultCenter singleton defaultCenter , en su esencia, NSNotificationCenter es en realidad solo un "mecanismo de desacoplamiento genérico". Permitirle alloc/init sus propias instancias es solo una expresión de ese genérico. Si quisieras usarlo para otra cosa, podrías.

Para ilustrar con un ejemplo un tanto absurdo, piénselo de esta manera: NSDocument tiene un windowControllers que devuelve una instancia específica, bendecida e importante de NSArray que contiene referencias a todos los controladores de ventana específicos de ese documento. Dicho esto, NSArray es solo una "estructura de datos de lista genérica". El hecho de que exista esta instancia especial con un propósito específico no significa que pueda no ser útil reutilizar NSArray para sus propios fines. Tanto NSArray como NSNotificationCenter proporcionan estructuras de datos / bloques de construcción genéricos, casos específicos de los cuales se usan en "ocupaciones" bendecidas en torno a AppKit, pero ambos podrían ser útiles por sí solos.

El caso de uso principal que he visto para crear instancias independientes de NSNotificationCenter es cuando desea ejecutar varias instancias de algún subsistema complejo en varios subprocesos en paralelo y no confundirlas con las notificaciones entre subprocesos. En este caso, el patrón general es asignar un NSNotificationCenter por subproceso. Esto divide las notificaciones para cada red de objetos en un solo hilo. Esto generalmente se requerirá si los observadores pasan nil para el parámetro objeto con la intención de escuchar todas las notificaciones con un nombre dado, independientemente de la fuente.

Dicho todo esto, reconozco que, en mi experiencia, hacer instancias privadas de NSNotificationCenter es bastante raro.


La documentación de Apple es vaga, y simplemente establece que normalmente un programador no tendría que crear uno nuevo:

Cada programa Cocoa en ejecución tiene un centro de notificaciones predeterminado. Normalmente no creas el tuyo. Un objeto NSNotificationCenter puede entregar notificaciones solo dentro de un solo programa.

Fuente completa: documentación de NSNotificationCenter .

Sin embargo, cada centro de notificación puede manejar una red de notificaciones, distinguidas por nombre y objeto. Cuando agrega un observador, normalmente llama al método de alguna manera como esta:

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

Y cuando publicas una notificación puedes especificar el objeto:

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

De esta manera, digamos que usa N nombres y M objetos, puede manejar N * M notificaciones distinguidas. Creo que no hay necesidad de usar dos centros de notificación. Teóricamente, si ha terminado todos los nombres, puede crear otro utilizando alloc + init, pero casi no veo cómo puede resultar útil.

También tenga en cuenta que el centro de notificación se usa a menudo cuando hay dos objetos que no poseen un puntero directo entre sí (de lo contrario, ¿por qué no llamar simplemente un método en él?), Debido a que se evitan los enlaces complicados (especialmente cuando se utiliza mucha xib). archivos), por lo que tener un objeto de centro de notificación único es muy útil.

Si, en cambio, utiliza un centro de notificación obtenido con allot + init, debe asegurarse de que todos los objetos en comunicación tengan un puntero hacia ese centro de notificación, y esto agregaría cierta complejidad. Todo el poder del centro de notificaciones se desperdiciaría.