学习通知提出的几个问题,
1、一般的通知方式(同步的)
2、如何定义异步通知
3、通知与线程的关系
4、如何在不同线程发送通知
1.1、通知的基本概念:自己百度呀。
[[NSNotificationCenter defaultCenter] postNotificationName:name object:nil userInfo:@{@"value":@"nihao"}]; //发送通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(print:) name:name object:nil]; // 接受通知
2.1 异步通知
NSNotification *noti = [NSNotification notificationWithName:name object:self];
NSNotificationQueue *queue = [[NSNotificationQueue alloc] init];
// [queue enqueueNotification:noti postingStyle:NSPostWhenIdle];
[queue enqueueNotification:noti postingStyle:NSPostWhenIdle coalesceMask:NSNotificationNoCoalescing forModes:@[NSDefaultRunLoopMode]];
- 注意: 每一个app只有一个 [NSNotificationCenter defaultCenter] 实例,而每一条线程都有一个 [[NSNotificationQueue alloc] init] 实例。
3、保证runloop运行,通知才能运行。一般上,在哪条线程发送通知,就在哪条线程接受通知。
- (IBAction)click:(id)sender {
// 同步执行 系统默认开启了runloop
[NSThread detachNewThreadWithBlock:^{
NSLog(@"111");
[[NSNotificationCenter defaultCenter] postNotificationName:name object:nil userInfo:@{@"value":@"nihao"}];
NSLog(@"222");
}];
// // 异步执行 手动开启runLoop
[NSThread detachNewThreadWithBlock:^{
NSLog(@"111");
NSNotification *noti = [NSNotification notificationWithName:name object:self];
NSNotificationQueue *queue = [[NSNotificationQueue alloc] init];
// [queue enqueueNotification:noti postingStyle:NSPostWhenIdle];
[queue enqueueNotification:noti postingStyle:NSPostWhenIdle coalesceMask:NSNotificationNoCoalescing forModes:@[NSDefaultRunLoopMode]];
NSPort *prot = [NSPort port];
[[NSRunLoop currentRunLoop] addPort:prot forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]]; // 自动释放线程
// [[NSRunLoop currentRunLoop] run]; // 不会释放。
NSLog(@"222");
}];
}
NSNotificationCenter 系统处理了 runloop; NSNotificationCenter, NSNotificationQueue, NSPort,他们这三者的关系,是NSNotificationCenter 封装了NSNotificationQueue, NSNotificationQueue封装了NSPort
4、如何从子线程发送通知,主线程接受通知呢。