zoukankan      html  css  js  c++  java
  • Notification 到底怎么玩 ?与线程是怎样的错综复杂关系?

     
    区别并发队列串行队列主队列
    同步(sync) 没有开启新线程,串行执行任务 没有开启新线程,串行执行任务 主线程调用:死锁卡住不执行
    其他线程调用:没有开启新线程,串行执行任务
    异步(async) 有开启新线程,并发执行任务 有开启新线程(1条),串行执行任务 没有开启新线程,串行执行任务

    注册通知两种方式:
    以下统称A、B两种方式 如何移除通知就不多说了,贴出参考链接:https://blog.csdn.net/st646889325/article/details/53300684
    /* queue: 决定接收通知的线程 nil-与发通知的线程一致, currentQueue-与注册通知的线程一致, mainQueue-在主线程 usingBlock: 在规定的线程回调收到的通知 */ [[NSNotificationCenter defaultCenter] addObserverForName:kNotificationName1 object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { [weakSelf receviedNotificaion1:note]; }]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receviedNotificaion2:) name:kNotificationName2 object:nil];

    接收通知,二次处理 

    - (void)receviedNotificaion1:(NSNotification *)note {
        
        NSLog(@"
     收到 通知1 数据 ----- %@ ", [NSThread currentThread]);
        sleep(1.0);
        
        if (self.delegate && [self.delegate respondsToSelector:@selector(pushData:)]) {
            [self.delegate pushData:@[@"11"]];
        }
    }
    
    - (void)receviedNotificaion2:(NSNotification *)note {
        
        NSLog(@"
     收到 通知2 数据 ----- %@ ", [NSThread currentThread]);
        sleep(2.0);
        
        if (self.delegate && [self.delegate respondsToSelector:@selector(pushData:)]) {
            [self.delegate pushData:@[@"22"]];
        }
    }

    发送通知不同方式:串行、并发、主队列三种方式

    - (void)test:(UIButton *)button {
        
        dispatch_queue_t queue ;
        NSString *pushMethod = @"";
        if (button.tag == 100) {
           
            pushMethod = @"串行队列";
            queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
        
        } else if (button.tag == 200) {
        
            pushMethod = @"并发队列";
            queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
       
        } else if (button.tag == 300) {
           
            pushMethod = @"主队列";
            queue = dispatch_get_main_queue();
        }
        
        dispatch_async(queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
    
                NSLog(@"
     %@ 发出 通知1 数据 ----- %@ ",pushMethod, [NSThread currentThread]);
                [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName1
                                                                    object:nil
                                                                  userInfo:@{@"index":@(i+200)}];
                NSLog(@"
     %@ 结束 通知1  ----- %@ ", pushMethod, [NSThread currentThread]);
            }
        });
        
        dispatch_async(queue, ^{
            
            for (int i = 0; i < 2; i++) {
                
                NSLog(@"
     %@ 发出 通知2 数据 ----- %@ ",pushMethod, [NSThread currentThread]);
                [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName2
                                                                    object:nil
                                                                  userInfo:@{@"index":@(i+100)}];
                NSLog(@"
     %@ 结束 通知2  ----- %@ ",pushMethod, [NSThread currentThread]);
            }
        });
    }

    主线程创建通知,串行队列 - 发通知(为啥在同一个线程 ?可以百度GCD, 参考:https://www.jianshu.com/p/2d57c72016c6)

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(线程3)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(线程3)

    2018-11-18 14:49:22.513320+0800 NotificationQueuesDemo[57155:12888297] 
     注册 通知  ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:49:25.744370+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:25.745143+0800 NotificationQueuesDemo[57155:12888378] 
     收到 通知1 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:26.748952+0800 NotificationQueuesDemo[57155:12888378] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    
    2018-11-18 14:49:26.749148+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 结束 通知1  ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:26.749292+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:26.749438+0800 NotificationQueuesDemo[57155:12888378] 
     收到 通知1 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:27.752300+0800 NotificationQueuesDemo[57155:12888378] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    
    2018-11-18 14:49:27.755329+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 结束 通知1  ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:27.757479+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:27.758203+0800 NotificationQueuesDemo[57155:12888378] 
     收到 通知2 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:29.759594+0800 NotificationQueuesDemo[57155:12888378] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    
    2018-11-18 14:49:29.760352+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 结束 通知2  ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:29.760575+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:29.760703+0800 NotificationQueuesDemo[57155:12888378] 
     收到 通知2 数据 ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    2018-11-18 14:49:31.763164+0800 NotificationQueuesDemo[57155:12888378] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    
    2018-11-18 14:49:31.763490+0800 NotificationQueuesDemo[57155:12888378] 
     串行队列 结束 通知2  ----- <NSThread: 0x6000002615c0>{number = 3, name = (null)} 
    

    主线程创建通知,并发队列 - 发通知 (为啥不在同一个线程 ?可以百度GCD, 参考:https://www.jianshu.com/p/2d57c72016c6)

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(线程4)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(线程5)

    2018-11-18 14:52:16.545835+0800 NotificationQueuesDemo[57155:12889770] 
     并发队列 发出 通知1 数据 ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:16.545954+0800 NotificationQueuesDemo[57155:12888377] 
     并发队列 发出 通知2 数据 ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    2018-11-18 14:52:16.547021+0800 NotificationQueuesDemo[57155:12889770] 
     收到 通知1 数据 ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:16.547588+0800 NotificationQueuesDemo[57155:12888377] 
     收到 通知2 数据 ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    2018-11-18 14:52:17.548786+0800 NotificationQueuesDemo[57155:12889770] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    
    2018-11-18 14:52:17.549125+0800 NotificationQueuesDemo[57155:12889770] 
     并发队列 结束 通知1  ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:17.549425+0800 NotificationQueuesDemo[57155:12889770] 
     并发队列 发出 通知1 数据 ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:17.550082+0800 NotificationQueuesDemo[57155:12889770] 
     收到 通知1 数据 ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:18.552212+0800 NotificationQueuesDemo[57155:12888377] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    
    2018-11-18 14:52:18.552238+0800 NotificationQueuesDemo[57155:12889770] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    
    2018-11-18 14:52:18.552535+0800 NotificationQueuesDemo[57155:12888377] 
     并发队列 结束 通知2  ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    2018-11-18 14:52:18.552591+0800 NotificationQueuesDemo[57155:12889770] 
     并发队列 结束 通知1  ----- <NSThread: 0x600000261ec0>{number = 4, name = (null)} 
    2018-11-18 14:52:18.552824+0800 NotificationQueuesDemo[57155:12888377] 
     并发队列 发出 通知2 数据 ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    2018-11-18 14:52:18.553060+0800 NotificationQueuesDemo[57155:12888377] 
     收到 通知2 数据 ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    2018-11-18 14:52:20.556747+0800 NotificationQueuesDemo[57155:12888377] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    
    2018-11-18 14:52:20.557005+0800 NotificationQueuesDemo[57155:12888377] 
     并发队列 结束 通知2  ----- <NSThread: 0x600000262a00>{number = 5, name = (null)} 
    

      

    主线程创建通知,主队列 - 发通知 

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(main)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(main)

    2018-11-18 14:54:56.908301+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 发出 通知1 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:56.908828+0800 NotificationQueuesDemo[57155:12888297] 
     收到 通知1 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:57.909397+0800 NotificationQueuesDemo[57155:12888297] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000062600>{number = 1, name = main} 
    
    2018-11-18 14:54:57.909782+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 结束 通知1  ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:57.910096+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 发出 通知1 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:57.910454+0800 NotificationQueuesDemo[57155:12888297] 
     收到 通知1 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:58.911167+0800 NotificationQueuesDemo[57155:12888297] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000062600>{number = 1, name = main} 
    
    2018-11-18 14:54:58.911559+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 结束 通知1  ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:58.911814+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 发出 通知2 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:54:58.912215+0800 NotificationQueuesDemo[57155:12888297] 
     收到 通知2 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:55:00.913580+0800 NotificationQueuesDemo[57155:12888297] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000062600>{number = 1, name = main} 
    
    2018-11-18 14:55:00.913829+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 结束 通知2  ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:55:00.913981+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 发出 通知2 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:55:00.914128+0800 NotificationQueuesDemo[57155:12888297] 
     收到 通知2 数据 ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    2018-11-18 14:55:02.915882+0800 NotificationQueuesDemo[57155:12888297] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000062600>{number = 1, name = main} 
    
    2018-11-18 14:55:02.916972+0800 NotificationQueuesDemo[57155:12888297] 
     主队列 结束 通知2  ----- <NSThread: 0x600000062600>{number = 1, name = main} 
    

      

    主线程创建通知,串行、并发队列 - 发通知 (如果主队列发则整个流程都在主队列)

    注册A方式 queue->[NSOpetationQueue currentQueue] (或[NSOpetationQueue mainQueue] )

    发送(子线程3)、接收(主线程main)、代理回调(主线程main)、结束(子线程3)

    2018-11-18 14:57:19.560247+0800 NotificationQueuesDemo[57228:12892840] 
     注册 通知  <NSThread: 0x600000071600>{number = 1, name = main}----- <NSOperationQueue: 0x600000225fc0>{name = 'NSOperationQueue Main Queue'} 
    2018-11-18 14:57:35.673019+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:35.677783+0800 NotificationQueuesDemo[57228:12892840] 
     收到 通知1 数据 ----- <NSThread: 0x600000071600>{number = 1, name = main} 
    2018-11-18 14:57:36.679568+0800 NotificationQueuesDemo[57228:12892840] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000071600>{number = 1, name = main} 
    
    2018-11-18 14:57:36.680195+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 结束 通知1  ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:36.681018+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:36.681831+0800 NotificationQueuesDemo[57228:12892840] 
     收到 通知1 数据 ----- <NSThread: 0x600000071600>{number = 1, name = main} 
    2018-11-18 14:57:37.683226+0800 NotificationQueuesDemo[57228:12892840] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x600000071600>{number = 1, name = main} 
    
    2018-11-18 14:57:37.684008+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 结束 通知1  ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:37.684236+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:37.684413+0800 NotificationQueuesDemo[57228:12893025] 
     收到 通知2 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:39.685880+0800 NotificationQueuesDemo[57228:12893025] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    
    2018-11-18 14:57:39.686221+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 结束 通知2  ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:39.686460+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:39.686704+0800 NotificationQueuesDemo[57228:12893025] 
     收到 通知2 数据 ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    2018-11-18 14:57:41.688942+0800 NotificationQueuesDemo[57228:12893025] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    
    2018-11-18 14:57:41.689344+0800 NotificationQueuesDemo[57228:12893025] 
     串行队列 结束 通知2  ----- <NSThread: 0x600000279bc0>{number = 3, name = (null)} 
    

      

    继续!!!

    子线程注册通知,串行队列 - 发通知

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(线程3)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(线程3)

    2018-11-18 15:13:15.225519+0800 NotificationQueuesDemo[57295:12900324] 
     注册 通知  <NSThread: 0x60000026a700>{number = 3, name = (null)}----- (null) 
    2018-11-18 15:13:19.809615+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:19.810567+0800 NotificationQueuesDemo[57295:12900324] 
     收到 通知1 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:20.813167+0800 NotificationQueuesDemo[57295:12900324] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    
    2018-11-18 15:13:20.813373+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 结束 通知1  ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:20.814090+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:20.814890+0800 NotificationQueuesDemo[57295:12900324] 
     收到 通知1 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:21.818488+0800 NotificationQueuesDemo[57295:12900324] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    
    2018-11-18 15:13:21.818717+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 结束 通知1  ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:21.819213+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:21.819659+0800 NotificationQueuesDemo[57295:12900324] 
     收到 通知2 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:23.820382+0800 NotificationQueuesDemo[57295:12900324] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    
    2018-11-18 15:13:23.820766+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 结束 通知2  ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:23.821107+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:23.821451+0800 NotificationQueuesDemo[57295:12900324] 
     收到 通知2 数据 ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    2018-11-18 15:13:25.822801+0800 NotificationQueuesDemo[57295:12900324] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    
    2018-11-18 15:13:25.823148+0800 NotificationQueuesDemo[57295:12900324] 
     串行队列 结束 通知2  ----- <NSThread: 0x60000026a700>{number = 3, name = (null)} 
    

      

    子线程注册通知,并发队列 - 发通知

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(线程4)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(线程5)

    2018-11-18 15:15:34.948496+0800 NotificationQueuesDemo[57295:12901429] 
     并发队列 发出 通知1 数据 ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:34.948565+0800 NotificationQueuesDemo[57295:12900332] 
     并发队列 发出 通知2 数据 ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    2018-11-18 15:15:34.949852+0800 NotificationQueuesDemo[57295:12901429] 
     收到 通知1 数据 ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:34.950626+0800 NotificationQueuesDemo[57295:12900332] 
     收到 通知2 数据 ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    2018-11-18 15:15:35.955805+0800 NotificationQueuesDemo[57295:12901429] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    
    2018-11-18 15:15:35.956233+0800 NotificationQueuesDemo[57295:12901429] 
     并发队列 结束 通知1  ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:35.956565+0800 NotificationQueuesDemo[57295:12901429] 
     并发队列 发出 通知1 数据 ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:35.957801+0800 NotificationQueuesDemo[57295:12901429] 
     收到 通知1 数据 ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:36.952033+0800 NotificationQueuesDemo[57295:12900332] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    
    2018-11-18 15:15:36.952498+0800 NotificationQueuesDemo[57295:12900332] 
     并发队列 结束 通知2  ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    2018-11-18 15:15:36.953106+0800 NotificationQueuesDemo[57295:12900332] 
     并发队列 发出 通知2 数据 ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    2018-11-18 15:15:36.953436+0800 NotificationQueuesDemo[57295:12900332] 
     收到 通知2 数据 ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    2018-11-18 15:15:36.958766+0800 NotificationQueuesDemo[57295:12901429] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    
    2018-11-18 15:15:36.958991+0800 NotificationQueuesDemo[57295:12901429] 
     并发队列 结束 通知1  ----- <NSThread: 0x60400027a940>{number = 4, name = (null)} 
    2018-11-18 15:15:38.958522+0800 NotificationQueuesDemo[57295:12900332] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    
    2018-11-18 15:15:38.958864+0800 NotificationQueuesDemo[57295:12900332] 
     并发队列 结束 通知2  ----- <NSThread: 0x60400027a980>{number = 5, name = (null)} 
    

      

    子线程注册通知,主队列 - 发通知

    注册A方式 queue->nil :发送、接收、代理回调、结束都在在同一个线程(main)

    注册B方式:        发送、接收、代理回调、结束都在在同一个线程(main)

    2018-11-18 15:17:10.080285+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 发出 通知1 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:10.080699+0800 NotificationQueuesDemo[57295:12900234] 
     收到 通知1 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:11.082156+0800 NotificationQueuesDemo[57295:12900234] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    
    2018-11-18 15:17:11.082575+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 结束 通知1  ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:11.082917+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 发出 通知1 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:11.083250+0800 NotificationQueuesDemo[57295:12900234] 
     收到 通知1 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:12.083721+0800 NotificationQueuesDemo[57295:12900234] 
     代理回调收到通知数据 (
        11
    ) ------ <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    
    2018-11-18 15:17:12.083979+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 结束 通知1  ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:12.084139+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 发出 通知2 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:12.084274+0800 NotificationQueuesDemo[57295:12900234] 
     收到 通知2 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:14.085683+0800 NotificationQueuesDemo[57295:12900234] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    
    2018-11-18 15:17:14.086092+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 结束 通知2  ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:14.086430+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 发出 通知2 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:14.086784+0800 NotificationQueuesDemo[57295:12900234] 
     收到 通知2 数据 ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    2018-11-18 15:17:16.088062+0800 NotificationQueuesDemo[57295:12900234] 
     代理回调收到通知数据 (
        22
    ) ------ <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    
    2018-11-18 15:17:16.089131+0800 NotificationQueuesDemo[57295:12900234] 
     主队列 结束 通知2  ----- <NSThread: 0x60000006d7c0>{number = 1, name = main} 
    

      

    子线程注册通知,串行、并发队列 - 发通知  ,注册A方式 queue->[NSOpetationQueue currentQueue] 

    串行,发送、接收、代理回调、结束 同一个子线程

    并行 ,发送、接收、代理回调、结束 分别两个子线程

    主队列,发送、接收、代理回调、结束  都在主线程

    子线程注册通知,串行、并发队列 - 发通知  ,注册A方式 queue->[NSOpetationQueue mainQueue] 

    串行和并行,发送(子线程3)、接收(主线程main)、代理回调(主线程main)、结束(子线程3)

    主队列 ,  整个流程都在main

    无论在 主线程、子线程 注册通知通过以上测试,可以大概得出这样的论断:

    发通知->收到通知->通知处理代码->整个通知结束,这是个串行队列,如果通知处理过程复杂,那么通知结束的log就越晚打印,就是说后续代码越晚执行,但是不在主队列玩是不会造成 主线程阻塞的(不会卡主UI)。

     那么问题来了,我只是发个通知而已,为啥要等接收通知的人干完他的事,然后我才能继续赶我自己的事儿呢 ?

    我只管发通知,谁愿意要谁要,但是不能阻碍我继续干活,谁收到通知以后自己找个房间自己玩(自己开个线程玩儿去),不要耽误我继续。

    所以,自己开个子线程处理收到通知以后的事情。

             串行、并行都解决问题,要看具体场景。
             
            queue1 = dispatch_queue_create("com.notification.queue1", DISPATCH_QUEUE_SERIAL);
            queue2 = dispatch_queue_create("com.notification.queue2", DISPATCH_QUEUE_SERIAL);
            
            // queue1 = dispatch_queue_create("com.notification.queue1", DISPATCH_QUEUE_CONCURRENT);
            // queue2 = dispatch_queue_create("com.notification.queue2", DISPATCH_QUEUE_CONCURRENT);  

    - (void)receviedNotificaion1:(NSNotification *)note {
        
        NSLog(@"
     收到 通知1 数据 ----- %@ ", [NSThread currentThread]);
    //    sleep(1.0);
        
        dispatch_async(queue1, ^{
            
            [self.dataSource1 addObject:note];
            NSLog(@"
     通知1 加入数组 %lu ----- %@ ",(unsigned long)self.dataSource1.count, [NSThread currentThread]);
    
        });
        
        dispatch_async(queue1, ^{
            
            if (self.dataSource1.count == 20) {
                
                if (self.delegate && [self.delegate respondsToSelector:@selector(pushData:type:)]) {
                    [self.delegate pushData:self.dataSource1 type:1];
                }
                
                [self.dataSource1 removeAllObjects];
            }
        });
    }
    
    - (void)receviedNotificaion2:(NSNotification *)note {
        
        NSLog(@"
     收到 通知2 数据 ----- %@ ", [NSThread currentThread]);
    //    sleep(2.0);
    
        dispatch_async(queue2, ^{
            
            [self.dataSource2 addObject:note];
            NSLog(@"
     通知2加入数组 %lu ----- %@ ",(unsigned long)self.dataSource2.count, [NSThread currentThread]);
            
        });
        
        dispatch_async(queue2, ^{
            
            if (self.dataSource2.count == 20) {
                
                if (self.delegate && [self.delegate respondsToSelector:@selector(pushData:type:)]) {
                    [self.delegate pushData:self.dataSource2 type:2];
                }
                
                [self.dataSource2 removeAllObjects];
            }
        });
    }
    

      

    看一下log就知道了 发出->收到通知->通知结束 在同一个线程4, 收到通知后数据处理在另一个线程5.

    2018-11-18 16:14:38.628166+0800 NotificationQueuesDemo[57810:12931075] 
     注册 通知  <NSThread: 0x60000027d640>{number = 3, name = (null)}----- (null) 
    2018-11-18 16:14:45.060534+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.061409+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.062306+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知1  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.062306+0800 NotificationQueuesDemo[57810:12931075] 
     通知1 加入数组 1 ----- <NSThread: 0x60000027d640>{number = 3, name = (null)} 
    2018-11-18 16:14:45.062955+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.063466+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.063882+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知1  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.063888+0800 NotificationQueuesDemo[57810:12931075] 
     通知1 加入数组 2 ----- <NSThread: 0x60000027d640>{number = 3, name = (null)} 
    2018-11-18 16:14:45.063962+0800 NotificationQueuesDemo[57810:12931076] 
     代理回调收到 通知1 数据 2个   ------ <NSThread: 0x60400046e640>{number = 5, name = (null)} 
    
    2018-11-18 16:14:45.064262+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.065350+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知1 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.065780+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知1  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.065780+0800 NotificationQueuesDemo[57810:12931076] 
     通知1 加入数组 1 ----- <NSThread: 0x60400046e640>{number = 5, name = (null)} 
    2018-11-18 16:14:45.066347+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.066767+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.067470+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知2  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.067474+0800 NotificationQueuesDemo[57810:12931076] 
     通知2加入数组 0 ----- <NSThread: 0x60400046e640>{number = 5, name = (null)} 
    2018-11-18 16:14:45.068284+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.068453+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.068806+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知2  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.068837+0800 NotificationQueuesDemo[57810:12931076] 
     通知2加入数组 1 ----- <NSThread: 0x60400046e640>{number = 5, name = (null)} 
    2018-11-18 16:14:45.069003+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 发出 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.069276+0800 NotificationQueuesDemo[57810:12931074] 
     收到 通知2 数据 ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.069536+0800 NotificationQueuesDemo[57810:12931074] 
     串行队列 结束 通知2  ----- <NSThread: 0x6000004625c0>{number = 4, name = (null)} 
    2018-11-18 16:14:45.069538+0800 NotificationQueuesDemo[57810:12931076] 
     通知2加入数组 2 ----- <NSThread: 0x60400046e640>{number = 5, name = (null)} 
    2018-11-18 16:14:45.069590+0800 NotificationQueuesDemo[57810:12931075] 
     代理回调收到 通知2 数据 2个   ------ <NSThread: 0x60000027d640>{number = 3, name = (null)} 
    

       

    demo 地址: https://github.com/MadahaCEO/NotificationQueue

      

  • 相关阅读:
    5.Spring高级装配(根据profile的激活状态决定使用的环境) 以及 条件化 Bean
    4.SpringJunit4ClassRunner
    3.Spring配置可选方案
    2.Spring容器bean的生命周期
    1.使用spring上下文容纳你的Bean
    maven 打包跳过 Junit test
    HTML5中meta name="viewport"
    二、JavaScript this
    VIM_插件
    VBS_DO...Loop
  • 原文地址:https://www.cnblogs.com/madaha/p/9977537.html
Copyright © 2011-2022 走看看