美文网首页iOS点点滴滴
iOS多线程 之 GCD浅析

iOS多线程 之 GCD浅析

作者: fwlong | 来源:发表于2016-06-03 20:07 被阅读46次
    • GCD 即 Grand Central Dispatch的简称,译为“伟大的中枢调度器”。
    • 它是一种纯C语言,提供了非常多的强大的函数。
    • GCD的优势:
      GCD是苹果公司为多核的并行运算提出的解决方案;
      GCD会自动利用更多的CPU内核;
      GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程);
      程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。

    GCD中的两个核心概念

    任务:执行什么操作
    队列:用来存放任务

    GCD的使用步骤

    • 定制任务:确定想要做的事情
    • 将任务添加到队列中:GCD会自动将队列中的任务取出,放到对应的线程中执行,并遵循FIFO原则:先进先出,后进后出。

    队列的类型

    • 并发队列:允许多个任务并发(同时)执行;并发功能只能在异步(dispatch_async)函数下才有效;
    • 串行队列:让任务一个接着一个的执行;

    执行队列中任务的两种方式

    • 同步:只能在当前线程执行任务,不具备开启新线程的能力
    • 异步:可以在新的线程执行任务,具备开启新线程的能力

    执行任务

    • 用同步的方式执行任务
      dispatch_sync(dispatch_queue_t queue , dispatch_block_t block);
      -queue: 队列
      -block: 任务
    • 用异步的方式执行任务
      dispatch_async(dispatch_queue_t queue,dispatch_block_t block);

    容易混淆的术语

    同步、异步、并发、串行

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

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

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

    • 并发:多个任务并发(同时)执行
    • 串行:一个任务执行完毕后,再执行下一个任务

    GCD的基本使用

    并发+异步 可以开启多线程

    -(void)asyncGlobalQueue{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);
    dispatch_async(queue, ^{
            // block会在子线程中执行
            NSLog(@"1:%@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"2:%@",[NSThread currentThread]);
        });
    }
    

    并发+同步 不会开启新的线程,并发失去了效果

    -(void)syncGlobalQueue{
    //创建队列(并发)---可以开启多个线程
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        //添加任务  同步--- 顺序执行
        dispatch_sync(queue, ^{
            
            NSLog(@">1:%@",[NSThread currentThread]);
        });
    //不会开启新的线程,并发失去了效果
    }
    

    串行+异步 不可以开启多个线程

    -(void)asyncSearialQueue{
     dispatch_queue_t queue = dispatch_queue_create("Abb", NULL);
        dispatch_async(queue, ^{
            NSLog(@"2:%@",[NSThread currentThread]);
        });
        //只开辟了一个线程
    }
    

    串行+同步

    -(void)syncSeariaQueue
    {
        dispatch_queue_t queue = dispatch_queue_create("dfg", NULL);
        //任务
        dispatch_sync(queue, ^{
            NSLog(@"%@",[NSThread currentThread]);
            
        });
    }
    
    

    总结:
    同步/异步主要影响 是能不能开启新的线程
    1、同步:在当前的线程中执行任务,不具备开启线程的能力
    2、异步:在新的线程中执行任务,具备开启新线程的能力

    并发/串行主要影响 任务的执行方式
    1、并发:多个任务同时执行
    2、串行:一个任务执行完毕之后,在执行下一个任务

    使用 GCD去创建一行队列

    //第一种
        dispatch_queue_t queue = dispatch_queue_create("aaa", 0);
        //第二种    最常用的创建队列方式
        //系统提供的串行队列的方法
        dispatch_queue_t queue = dispatch_get_main_queue();
    

    使用GCD去创建一个并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    

    几秒之后做一个操作

    //参数1:表示的是从现在开始  参数2:延迟时间 NSEC: PER SEC 参数3:任务
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)),dispatch_get_main_queue() , ^{
           NSLog(@"3喵就跑");   
       });
    
    

    重复往一个队列中添加多个任务

     //串行队列
    //    DISPATCH_QUEUE_CONCURRENT 并发
        dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
        
        dispatch_apply(20, queue, ^(size_t index) {
            
            NSLog(@"%@,%ld",[NSThread currentThread],index);
        });
    
    

    分组

        //创建分组
        dispatch_group_t group = dispatch_group_create();
        //创建队列
        dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
        //创建任务1
        dispatch_group_async(group, queue, ^{
            
            NSLog(@"我是1");
        });
        dispatch_group_async(group, queue, ^{
            
            NSLog(@"我是2");
        });
        dispatch_group_async(group, queue, ^{
            
            NSLog(@"我是3");
        });
    
    
    -(void)loadData{
        NSURLSession * session = [NSURLSession sharedSession];
        NSURLSessionTask * task = [session dataTaskWithURL:[NSURL URLWithString:@""] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            if (error == nil) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    //更新UI事情
                    
                });
            }
        }];
        //启动
        [task resume];
    }
    
    

    相关文章

      网友评论

        本文标题:iOS多线程 之 GCD浅析

        本文链接:https://www.haomeiwen.com/subject/qdhldttx.html