GCD-Grand Central Dispatch

社会主义新天地 提交于 2020-04-03 05:30:52

经常要用的,总结分类一下。

   //获得队列 DISPATCH_QUEUE_PRIORTY 优先级 
    dispatch_queue_t Queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
    dispatch_queue_t MainQueue = dispatch_get_main_queue();
    
    //自定义Queue 第二参数默认串行(FIFO)  DISPATCH_QUEUE_CONCURRENT(可选,并发)
    dispatch_queue_t SelfQueue = dispatch_queue_create("COM.M1989.Queue", NULL);
    
    
    //dispatch_async
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        
        //Do Some?
        
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        
        //耗时操作
        
         dispatch_async(dispatch_get_main_queue(), ^{
             
             //更新界面
             
         });
        
    });
    
    //dispatch_once_t 单例模式常用
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
    });
    
    
    // dispatch_apply 并行,可利用CPU多核进行多线程操作 不过会阻塞当前线程,
    
    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t y) {
        
        NSLog(@"123,%zu",y);
        
    });
    
    //觉得还是反正子线程比较好。如下
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
         
         dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t y) {
             
             NSLog(@"123,%zu",y);
             
         });
         
     });
    
    //dispatch_after 延迟执行,缺点不能临时取消,起码NSTimer 有个-(void)invalidate 能取消
    
    double Seconds = 10.0;
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (Seconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void){
        //延后10秒需要执行的代码
    });
    
    //dispatch_group_t 并行 group全部完成后发消息给notify,执行notify里block内容。 不阻塞当前线程。。。。
    dispatch_group_t groupQ = dispatch_group_create();
    
    dispatch_group_async(groupQ, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"1");
    });
    
    dispatch_group_async(groupQ, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"2");
    });
    
    dispatch_group_async(groupQ, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for(int i = 0;i<10000;i++){
            NSLog(@"3");
        }
    });
    
    dispatch_group_notify(groupQ, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       
        NSLog(@"OK");
        
    });

    //dispatch_barrier_async  等待前面所有的任务执行完,并中断在此之后的任务。当前面的任务执行完后,此会执行,并恢复后面的任务。(试了,结果不理想)
    
    dispatch_barrier_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"barrier");
    });

 

未完待续。。。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!