objective-c ios nsnotificationcenter

objective c - NSNotificación del orden de notificaciones del observador.



objective-c ios (3)

Si tengo varias clases observando una NSNotificación particular, ¿en qué orden se notifica a los observadores cuando se publica la notificación?


El orden no está definido. Apple administra una lista de observadores y cada vez que se publica la notificación, recorren la lista y notifican a cada observador registrado. La lista puede ser una matriz o un diccionario o algo completamente diferente (por ejemplo, una lista vinculada de estructuras) y dado que los observadores se pueden agregar y eliminar en tiempo de ejecución en cualquier momento, la lista también puede cambiar en cualquier momento, por lo tanto, incluso si supiera cómo hacerlo. la lista está implementada actualmente, nunca puede confiar en ningún orden específico. Además, cualquier actualización de OS X puede hacer que cambien los elementos internos de la lista y lo que es válido para 10.7 puede no ser cierto para 10.8 o 10.6.


Lo he probado y parece que los objetos están ordenados por el método addObserver

La salida de Consol para esta prueba es:

2016-04-04 22:04:02.627 notificationsTest[1910:763733] controller 8 2016-04-04 22:04:02.629 notificationsTest[1910:763733] controller 1 2016-04-04 22:04:02.629 notificationsTest[1910:763733] controller 2

AppDelegate.m

#import "AppDelegate.h" #import "ViewController.h" #include <stdlib.h> @interface AppDelegate () @property (strong, readwrite, nonatomic) NSTimer *timer; @property (strong, readwrite, nonatomic) NSMutableArray *array; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.array = [NSMutableArray array]; ViewController *vc3 = [ViewController new]; vc3.index = 8; ViewController *vc1 = [ViewController new]; vc1.index = 1; ViewController *vc2 = [ViewController new]; vc2.index = 2; [self.array addObject:vc1]; [self.array addObject:vc3]; [self.array addObject:vc2]; self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(sendNotification:) userInfo:nil repeats:YES]; return YES; } - (void)sendNotification:(NSNotification *)notification { [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTitle1 object:nil]; } @end

ViewController.m

#import "ViewController.h" #import "AppDelegate.h" @interface ViewController () @property (assign, readwrite, nonatomic) NSInteger index; @end @implementation ViewController - (instancetype)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(respondToNotification:) name:kNotificationTitle1 object:nil]; } return self; } - (void)respondToNotification:(NSNotification *)notification { NSLog(@"controller %ld", self.index); } @end


No hay garantía en cuanto a qué notificaciones de orden se envían. Si necesita un pedido, es posible que desee crear una clase que escuche una notificación y envíe múltiples notificaciones ordenadas que otras clases pueden escuchar en su lugar.