Подтвердить что ты не робот

Порядок NSNotification уведомлений наблюдателя

Если у меня есть несколько классов, наблюдающих конкретную NSNotification, в каком порядке уведомления наблюдателей при отправке уведомления?

4b9b3361

Ответ 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