NSNotificationCenter异步通知

先说结论:
异步线程发送的Notification,也会在对应的线程中接到通知,并且,对于通知本身是同步执行的

// 发送通知
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_queue_t queue = dispatch_queue_create("testQ", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"currentThread1 == %@",[NSThread currentThread]);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"nTest" object:nil];
    });
}
// 接受通知
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(test:)
                                                 name:@"nTest" object:nil];
}

- (void)test:(NSNotification *)noti {
    NSLog(@"currentThread2 == %@",[NSThread currentThread]);
}
打印结果
demo[68642:1059621] currentThread1 == <NSThread: 0x6000036d0a80>{number = 7, name = (null)}
demo[68642:1059621] currentThread2 == <NSThread: 0x6000036d0a80>{number = 7, name = (null)}

同异步测试

- (void)touchesBegan:(NSSet<UITouch *> *)touches
           withEvent:(UIEvent *)event {
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"currentThread1 == %@",[NSThread currentThread]);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"nTest" object:nil];
        sleep(3);
        NSLog(@"currentThread2 == %@",[NSThread currentThread]);
    });
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(test:)
                                                 name:@"nTest" object:nil];
}

- (void)test:(NSNotification *)noti {
    NSLog(@"currentThread3 == %@",[NSThread currentThread]);
}
打印结果
注意打印currentThread3与currentThread2,时间上差了3秒
16:38:34.345302+0800 hkzrdemo[70273:1151803] currentThread1 == <NSThread: 0x6000020460c0>{number = 8, name = (null)}
16:38:34.345538+0800 hkzrdemo[70273:1151803] currentThread3 == <NSThread: 0x6000020460c0>{number = 8, name = (null)}
16:38:37.350034+0800 hkzrdemo[70273:1151803] currentThread2 == <NSThread: 0x6000020460c0>{number = 8, name = (null)}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容