iOS开发:多线程之GCD

时间:2022-01-17 05:17:47

一、GCD简介

  • GCD(Grand Central Dispatch)是iOS4引入的强大的线程处理技术,它是基于XNU内核开发的,所以性能极为优越。
  • 终端输入man dispatch可打开GCD的框架。

二、GCD与多线程

(一)串行队列和并行队列(serial and concurrent

1.概念

  • 并行队列:同时无序执行
  • 串行队列:遵循FIFO原则,依次执行

2.队列的获取

  • 获取串行队列
//@param "com. 工程名 .queue1"  队列的标志,一般以倒置的域名+队列的名字命名
//@param 队列的类型的标志
dispatch_queue_t serialQueue = dispatch_queue_create("com.myProject.queue1", DISPATCH_QUEUE_SERIAL);
  • 获取并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.myProject.queue2", DISPATCH_QUEUE_CONCURRENT);

  • 获取主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    主队列是串行的队列。
  • 获取全局队列
    //@param 队列的优先级  DISPATCH_QUEUE_PRIORITY_BACKGROUND    //@param 预留接口    dispatch_queue_t globleQueue = dispatch_get_global_queue(0, 0);
    全局队列是并行的队列。

(二)异步执行和同步执行(asynchronous and synchronization

1.概念

  • 同步执行:阻塞当前线程,但不会开辟新的线程
  • 异步执行:不会阻塞当前线程,可能会开辟新的线程

2.执行方式

  • 同步执行
    dispatch_sync(globleQueue, ^{

    });

  • 异步执行
    dispatch_async(globleQueue, ^{

    });

(三)GCD开辟线程

  • 首先,选择是同步执行还是异步执行
    dispatch_async(dispatch_queue_t queue, ^{

    });
    dispatch_sync(dispatch_queue_t queue, ^{

    });

  • 其中,它需要一个dispatch_queue_t类型的参数,这个参数便是上文提到的队列,这里分三种情况:如果传主队列,不会开辟线程,如果传的是串行队列,只开辟一条线程,如果传的是并行队列,可能开辟多条线程。
  • 其后的blcok代码块就是你开辟线程需要执行的内容了。

(四)GCD线程组

  • 代码
        dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, globleQueue, ^{
    sleep(1);
    NSLog(@"下载图片1");
    });
    dispatch_group_async(group, globleQueue, ^{
    sleep(1);
    NSLog(@"下载图片2");
    });
    dispatch_group_async(group, globleQueue, ^{
    sleep(1);
    NSLog(@"下载图片3");
    });
    dispatch_group_notify(group, globleQueue, ^{
    NSLog(@"所有图片下载完成");
    });
    加入线程组的目的是为了集中管理各个线程,这里传入的是全局队列,由于它是并行队列,所以执行是并发无序的。

(五)线程等待

  • 代码
    //等待并行队列前面的任务执行完成,追加执行该任务;该任务执行完成,再执行并行队列后面的任务
    dispatch_barrier_async(dispatch_get_global_queue(0, 0), ^{

    });
    如果队列参数传入的是串行队列,没有任何意义,因为串行队列本身是有序的。