2012-10-18 9 views
18

Jeśli mam kilka zajęć obserwujących konkretną NSNotification, w jakiej kolejności obserwatorzy są powiadamiani o wysłaniu powiadomienia?Kolejność notowań NSNotification of observer

+2

Sądzę, że zostały zgłoszone w tej samej kolejności, co do dodania obserwatora. W każdym razie nie będę polegał na tym fakcie, ponieważ dotyczy to wewnętrznych elementów 'NSNotificationCenter' i może się zmienić w przyszłości. – atxe

Odpowiedz

18

Nie ma gwarancji co do tego, jakie powiadomienia o zamówieniach są wysyłane. Jeśli potrzebujesz zamówienia, możesz utworzyć klasę, która nasłuchuje na jedno powiadomienie i wysyłać wiele zamówionych powiadomień, których zamiast tego mogą wysłuchać inne klasy.

5

Kolejność jest niezdefiniowana. Apple zarządza listą obserwatorów i za każdym razem, gdy powiadomienie jest wysyłane, dokonuje iteracji na liście i powiadamia każdego zarejestrowanego obserwatora. Lista może być tablicą lub słownikiem lub czymś zupełnie innym (np. Powiązana lista struktur), a ponieważ obserwatorzy mogą być dodawani i usuwani w czasie wykonywania, lista może się również zmieniać w dowolnym momencie, a więc nawet jeśli wiesz, jak lista jest obecnie zaimplementowana, nigdy nie można polegać na żadnym konkretnym zamówieniu. Dalsza aktualizacja systemu OS X może spowodować zmianę wewnętrznych elementów listy i to, co jest prawdziwe w wersji 10.7, może nie być prawdziwe w przypadku wersji 10,8 lub 10.6.

0

Ja testowałem go i wygląda na to, że obiekty są sortowane według addObserver metoda

wyjście Consol dla tego testu jest:

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