如果我有几个类观察一个特定的 NSNotification,那么在发布通知时,观察者的通知顺序是什么?
问问题
3728 次
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 回答