Notification 到底怎么玩 ?

Posted madaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Notification 到底怎么玩 ?相关的知识,希望对你有一定的参考价值。

请一定注意log中打印时间 & 线程

 

主线程注册通知

- (instancetype)init {
    
    self = [super init];
    if (self) {
        
        [self addNotifications];
    }
    return self;
}

- (void)addNotifications {
    
    NSLog(@"
 注册 通知  ----- %@ ", [NSThread currentThread]);
    
    __weak typeof(self) weakSelf = self;
    /*
     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 {
    
    sleep(1.0);
    NSLog(@"
 收到 通知1 数据 ----- %@ ", [NSThread currentThread]);
}

- (void)receviedNotificaion2:(NSNotification *)note {
    
    sleep(2.0);
    NSLog(@"
 收到 通知2 数据 ----- %@ ", [NSThread currentThread]);
}

 

串行、并行、主队列分别发送通知

  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]);
        }
    });

 

 

控制台打印结果如下

1.串行发通知,睡眠1s后,收到通知log才打印。这 1s 模拟某种场景,然后继续发通知后续代码,但是不会卡主线程

 

2.并行队列发通知,睡眠1s后,收到通知log才打印。

 

3.主队列发通知,睡眠1s后,收到通知log才打印。

 

 

以上是关于Notification 到底怎么玩 ?的主要内容,如果未能解决你的问题,请参考以下文章

“啫喱”爆红一月主动下架,元宇宙社交到底该怎么玩?

UG设置深度优先到底怎么玩的?学生与老师一问一答

智能网联汽车到底该怎么玩?腾讯在成都放了个大招

Python 中 Mock 到底该怎么玩?一篇文章告诉你(超全)

宋星:oCPC效果到底怎么样,不搞清楚的话还是别玩信息流广告了

PKG文件到底怎么才能打开