22

如果我有几个类观察一个特定的 NSNotification,那么在发布通知时,观察者的通知顺序是什么?

4

3 回答 3

22

无法保证发出什么订单通知。如果您需要排序,您可能希望创建一个类来侦听一个通知并发送多个有序通知,其他类可以改为侦听。

于 2012-10-18T15:34:24.800 回答
7

订单未定义。Apple 管理一个观察者列表,每当发布通知时,它们都会遍历列表并通知每个注册的观察者。该列表可能是一个数组或字典或完全不同的东西(例如结构的链表),并且由于可以在运行时随时添加和删除观察者,因此列表也可能随时更改,因此即使您知道如何该列表目前已实施,您永远不能依赖任何特定的顺序。此外,任何 OS X 更新都可能导致列表内部结构发生变化,适用于 10.7 的内容可能不适用于 10.8 或 10.6。

于 2012-10-18T15:41:41.397 回答
1

我已经对其进行了测试,看起来对象是按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

视图控制器.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
于 2016-04-04T20:12:45.630 回答