iOS多线程 之 GCD浅析

  • 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浅析)