多线程中通知的使用

在iOS开发中大家使用通知时不知道有没有人想过一个问题;子线程的发出的通知会在哪个线程执行呢?
今天我们就来验证一下,废话不多说直接上代码

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_queue_t queue = dispatch_queue_create("com.dd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        // 在子线程中发出通知
        [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:nil];
        NSLog(@"发出通知线程==%@",[NSThread currentThread]);
    });
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observerFun) name:@"notification" object:nil];
}

- (void)observerFun{
    // 在主线程中监听通知
    NSLog(@"接受通知线程==%@",[NSThread currentThread]);
}

打印结果


1.png

可以看出中子线程发出的通知也是在子线程执行的,那如果是在主线程发出的通知呢?

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_queue_t queue = dispatch_queue_create("com.dd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        // 在子线程中监听通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observerFun) name:@"notification" object:nil];
    });
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // 在主线程中发出通知
    NSLog(@"发出通知线程==%@",[NSThread currentThread]);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:nil];
}

- (void)observerFun{
    NSLog(@"接受通知线程==%@",[NSThread currentThread]);
}

打印结果


2.png

可以看到主线程发出的通知接受通知执行代码的线程同样也是在主线程.

所以我们可以得出结论:接收通知代码执行的线程是由发出通知线程决定!

你以为这就完了吗?下面这段代码却不是适用上面这个结论。

//   queue:决定block在哪个线程执行,nil:在发布通知的线程中执行
//   [NSOperationQueue mainQueue]: 在主线程执行
//   [NSOperationQueue new]: 在子线程执行
[[NSNotificationCenter defaultCenter] addObserverForName:@"notification" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
   NSLog(@"接受通知线程==%@",[NSThread currentThread]);
}];

如果你用上面这段代码时,接受通知执行的线程就不由发出通知的线程决定了,通过queue参数可以自己决定block里的代码在哪个线程执行。验证的过程我就不写了,大家可以自己去试一试.

最终结论:

接收通知代码一般由发出通知线程决定,如果是调用NSNotificationCenter的addObserverForName:object:queue:usingBlock:方法时,接受通知代码的线程就可以通过queue参数自己决定在哪个线程执行.

你可能感兴趣的:(多线程中通知的使用)