IOS 多线程 GCD的使用

 GCD基本概念

    优势:自动利用更多的CPU内核,为多核的并行提出解决方案,自动管理线程的生命周期

    核心概念:任务、队列

 任务:执行什么操作

 队列:执行什么任务    类型:并发、串行

 将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,任务的取出遵循队列的  FIFO原则:先进先出,后进后出

   

                          并发队列                 手动创建串行队列            主队列

 

 同步 (sync)       没有开启新线程            没有开启新线程           没有开启新线程

                         串行执行任务              串行执行任务             串行执行任务

 

 异步 (async)        开启新线程                有新线程开启             没有开启新线程 

                          并发执行任务              串行执行任务             串行执行任务

 

 

 同步和异步主要影响:能不能开启新的线程

 

 同步:只是在当前线程中执行任务,不具备开启新线程的能力

 异步:可以在新的线程中执行任务,具备开启新线程的能力

 

 并发和串行主要影响:任务的执行方式

 

 并发:允许多个任务并发(同时)执行

 串行:一个任务执行完毕后,再执行下一个任务

#pragma mark - 主线程
//  主线程只能开异步,开同步会阻塞线程 产生死锁
    dispatch_queue_t mainqueue=dispatch_get_main_queue();
    dispatch_async(mainqueue, ^{
        NSLog(@"aaaa");
    });
#pragma mark - 子线程(后台线程)
    dispatch_queue_t global=dispatch_get_global_queue(0, 0);
    dispatch_async(global, ^{
        NSLog(@"子线程");
    });
    
#pragma mark - 一次性线程
    //某段代码在程序运行过程中只被执行1次
    static dispatch_once_t oneQueue;
    dispatch_once(&oneQueue, ^{
        NSLog(@"一次性线程");
    });
#pragma mark - 延迟 N 秒 执行线程
    double doubleQueue=2.0;
    dispatch_time_t popTime=dispatch_time(DISPATCH_TIME_NOW, doubleQueue*NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        NSLog(@"延迟两秒执行");
    });
#pragma mark - 自定义线程
    dispatch_queue_t user_queue=dispatch_queue_create("blog.lin.com", NULL);
    dispatch_async(user_queue, ^{
        
    });
#pragma mark -栅栏
//   栅栏:在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
    dispatch_group_t group=dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"线程一");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"线程二");
    });
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"汇总结果");
        
    });
    //先让后台两个线程并行执行,然后等两个线程都结束后再汇总结果
    
#pragma mark - 修改代码块之外的变量
    __block int i=0;
    void (^foo)(void)=^{
        i=1;
    };
    foo();//i修改成1,用__block
    
    
    //子线程嵌套主线程
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"子线程处理逻辑");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"主线程更新UI层");
        });
    });

 

posted on 2017-04-11 11:01  摩羯小伟  阅读(170)  评论(0编辑  收藏  举报

导航