偶然的一次, 开发中, 给同一个通知 注册了多次, 发现这个通知多次调用响应的方法, 才发现, 同一个对象是可以多次注册同一个通知的。
这点以后需要注意,
1.写在ViewController中的注册通知,在页面pop后会自动在通知中心移除自己;写在其他对象中的注册通知,释放后不会自动移除自己,这时候会引起崩溃。
另外 有说通知发送和 接受都是在同一线程内的,这个我不赞同!
2.发送通知的线程可能和接受通知的线程可能不是同一个线程,在接受通知时,需要单独处理。(NSNotificationCenter消息的接受线程是基于发送消息的线程的。也就是同步的,而有时候UI必须在主线程处理,不然会不响应,所以要针对处理)
测试代码如下:
//接受消息通知的回调
- (void)ResponseTest
{
if ([[NSThread currentThread] isMainThread]) {
NSLog(@"main");
} else {
NSLog(@"not main");
}
dispatch_async(dispatch_get_main_queue(), ^{
//do your UI
});
}
//发送消息的线程
- (void)sendNotification
{
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"testNotification" object:nil];
});
}