iOS多线程之GCD

GCD (Grand Central Dispatch)  大中央分配(调度)

GCD简介

 Grand Central Dispatch 简称( GCD )是苹果公司开发的技术。以优化应用程序支持多核心处理器和其他的对称多处理系统的系统。
 GCD 属于函数级的多线程,性能更高,功能也更加强大

GCD核心概念
 
  任务:具有一定功能的代码段。一般是一个 block 或者函数。
  分发队列: GCD 以队列的方式进行工作, FIFO
 GCD 会根据分发队列的类型,创建合适数量的线程执行队列中的任务。

  是基于 C 语言的底层 API
  Block 定义任务,使用起来非常灵活便捷
  提供了更多的控制能力以及操作队列中所不能使用的底层函数

//GCD: 异步执行任务的技术之一,一般是将应用程序中记述的线程管理用代码在系统级实现,由于是系统级的管理,这样的话将有更好的线程效率。
    // 1. task    任务
    // 2. Queue   队列
    // 3. Thread  线程
     // Task 是一个一个的任务 , 可以是方法 , 函数
       // Queue 队列 为了保证任务的顺利执行 , 线程会被放到队列中 , 顺序执行
    // Thead 线程 , 每个任务都会被放到一个适当的线程中执行

    // CGD 有两种方式的对线程
    // 一个是 searial 串行队列  另一种是 concurrent Queue 并行队列

     // 第一种 searial Queue ( 串行线程 ), 串行队列 , 先进先出 (FIFO)
    // 特点 : 一个线程执行完之后 , 再执行下一个线程 , 必须等待上一个线程执行完成后 , 下一个线程才会执行
   
    // 第二种 councurrent Queue 是并发队列
    // 特点 : 一个线程开始后 , 下一个线程可以执行 , 不必等待前一个线程完成 .

 GCD 的基本思想是就将操作 s 放在队列 s 中去执行
  操作使用 Blocks 定义
  队列负责调度任务执行所在的线程以及具体的执行时间
  队列的特点是先进先出 (FIFO) 的,新添加至对列的操作都会排在队尾
 
  提示
 GCD 的函数都是以 dispatch( 分派、调度 ) 开头的队列
 dispatch_queue_t
  串行队列,队列中的任务只会顺序执行
  并行队列,队列中的任务通常会并发执行
  操作
 dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序
 dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序

//    线程间通信分为两种:
//    主线程进入子线程(前面的方法都可以)
//    子线程回到主线程

GCD功能
 dispatch_async()    // 往队列中添加任务,任务会排队执行
 dispatch_after()      // 往队列中添加任务,任务不但会排队,还会在延迟的时间点执行
 dispatch_apply()    // 往队列中添加任务,任务会重复执行 n

 dispatch_group_async()   // 将任务添加到队列中,并添加分组标记
 dispatch_group_notify()    // 将任务添加到队列中,当某个分组的所有任务执行完之后,此任务才会执行
 dispatch_barrier_async()  // 将任务添加到队列中,此任务执行的时候,其他任务停止执行

 dispatch_once()   // 任务添加到队列中,但任务在程序运行过程中,只执行一次
 dispatch_sync()   // 将任务添加到队列中, block 不执行完,下面代码不会执行

 dispatch_async_f()  //将任务添加到队列中,任务是函数非block


- (void)gcdtest
{
    
//    // 1. 创建全局的并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 1.2 创建异步开启线程2
    dispatch_async(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
    // 1.3 创建异步开启线程3
    dispatch_async(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
    // 1.4 创建异步开启线程4
    dispatch_async(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
    
    // 2. 创建串行对列
    
    dispatch_queue_t serialqueue = dispatch_queue_create("串行队列", NULL);
    
    // 异步:只开辟一个新的线程,顺序的执行任务.
    dispatch_async(serialqueue, ^{
        NSLog(@"%@",[NSThread currentThread]);
        
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"%@",[NSThread currentThread]);
        
    });
    
    // 同步: 在当前线程中执行,主线程中
    dispatch_sync(serialqueue, ^{
        NSLog(@"%@",[NSThread currentThread]);
        
    });
    
    // 3.从其他线程回到主线程
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        // 再非主线程中执行比较复杂和比较耗时操作.
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            //再主线程中完成刷新UI的事件
        });
    });
    
    
    //GCD 其他用法
    
    // iOS中常见的延迟操作有两种
    // 方法1
    [self performSelector:@selector(afterRun) withObject:nil afterDelay:2];
    
    // 方法2
    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
   
    dispatch_after(when,queue , ^{
        [self afterRun];
    });
    
    // //将任务添加到队列中,并添加分组标记

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"1%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"2%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, queue, ^{
        NSLog(@"3%@",[NSThread currentThread]);
    });
    
    // 任务完成后,得到通知
    dispatch_group_notify(group, queue, ^{
        NSLog(@"队列执行完毕 %@",[NSThread currentThread]);
    });
    
    
}

- (void)afterRun
{
    NSLog(@"%@",[NSThread currentThread]);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值