Если у меня есть несколько классов, наблюдающих конкретную NSNotification, в каком порядке уведомления наблюдателей при отправке уведомления?
Порядок NSNotification уведомлений наблюдателя
Ответ 1
Нет никаких гарантий относительно того, какие уведомления отправляются. Если вам нужен заказ, вы можете создать класс, который прослушивает одно уведомление и отправляет несколько упорядоченных уведомлений, которые могут прослушивать другие классы.
Ответ 2
Порядок undefined. Apple управляет списком наблюдателей и всякий раз, когда уведомление отправляется, они перебирают список и уведомляют каждого зарегистрированного наблюдателя. Список может представлять собой массив или словарь или что-то совершенно другое (например, связанный список структур), и поскольку наблюдатели могут быть добавлены и удалены во время выполнения в любое время, список может также измениться в любое время, таким образом, даже если вы знали, как список в настоящее время реализован, вы никогда не сможете опираться на какой-либо конкретный порядок. Кроме того, любое обновление ОС X может привести к тому, что внутренности списка изменится, а то, что справедливо для 10.7, может не соответствовать true для 10.8 или 10.6.
Ответ 3
Я протестировал его, и похоже, что объекты упорядочены с помощью метода addObserver
Выход для консоли для этого теста:
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