2012-10-18 48 views
18

Belli bir NSNotification gözlemleyerek çeşitli sınıflar varsa, bildirim gönderildiğinde gözlemciler hangi sırada bildirilir?NSNotification bildirimi siparişi bildirimi

+2

Gözlemleyiciyi eklediklerinden, aynı sırada bildirildiklerine inanıyorum. Her neyse, bu gerçeğe güvenmeyeceğim çünkü bu “NSNotificationCenter” ın içeriğiyle ilgilidir ve gelecekte değişebilir. – atxe

cevap

18

Hangi sipariş bildirimlerinin gönderildiği konusunda herhangi bir garanti verilmez. Bir siparişe ihtiyacınız varsa, bir bildirimi dinleyen ve diğer sınıfların dinleyebildiği çoklu sipariş bildirimlerini gönderen bir sınıf oluşturmak isteyebilirsiniz.

5

Sipariş tanımsız. Apple, gözlemcilerin listesini yönetir ve bildirim gönderildiğinde, liste üzerinde yinelenir ve her kayıtlı gözlemciye bildirilir. Liste bir dizi veya bir sözlük veya tamamen farklı bir yapı olabilir (örn. Yapıların birleştirilmiş listesi) ve gözlemciler herhangi bir zamanda çalışma zamanında eklenebilir ve çıkarılabilirler, liste de her an değişebilir; Liste şu anda uygulanmaktadır, hiçbir zaman belirli bir siparişe güvenemezsiniz. Ayrıca, herhangi bir OS X güncellemesi, liste dahililerinin değişmesine ve 10.7 için geçerli olanların 10.8 veya 10.6 için geçerli olmayabileceğine neden olabilir.

0

bunu test ettik ve nesneler addObserver yöntemi ile

bu test için

Konsol çıkışı sıralanır gibi görünüyor:

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