iOS开发多线程学习总结 - GCD的使用

文章内容和排版参考: iOS 多线程: [GCD]详尽总结

GCD - 核心概念:  任务 | 队列

任务: 就是指需要执行的代码, 在block中编写,有 同步执行 和 异步执行 两种方式.  举例:

 同步执行 -- 小时候爸妈说吃饭的时候不能看电视,要先吃完饭,才能去看电视,

 异步执行 -- 一边吃饭一边看电视,还可以同时做其他的事情.

  • 同步执行(sync) -- 使用 dispatch_sync(queue,^{需要执行的代码})
  1. 在任务执行完之前会一直等待,直到队列里的任务完成之后再执行
  2. 不会开启新的线程,只在当前线程执行
  • 异步执行(async) -- 使用 dispatch_async(queue,^{需要执行的代码})
  1. 不会等待,可以直接执行任务
  2. 会开启新的线程,可以在新的线程中执行

队列(Queue):  执行任务的等待队列, 用于存放任务, 有串行队列 和 并发队列

  • 串行队列(Serial)
  1. 任务只能一个接一个的执行(食堂只有一个窗口,多个人需要排队买饭)
  2. 主队列是特殊的串行队列(获取主队列:dispatch_get_main_queue())
  •  并发队列(Concurrent )
  1. 多个任务可以同时执行(食堂开启多个窗口,多个人可以同时买饭)
  2. 全局并发队列是并发队列(dispatch_get_global_queue())

GCD - 使用

在没有详细学习的时候,对GCD的使用总是很混乱,每次都要百度. 在使用时只需要记住: 创建队列、创建任务.

1. 创建队列

    dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);

    说明: 参数1 是队列唯一标识符(可以为空),参数二是队列类型,SERIAL(串行队列)CONCURRENT(并发队列)

2. 创建任务

    2.1 创建同步执行 + 串行队列

    - (void)testSerial {

         dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);

         // 同步任务

         dispatch_sync(queue, ^{

              [NSThread sleepForTimeInterval:3.0];

              NSLog(@"执行block");

         });

         NSLog(@"执行结束");

}        

     2.2 创建异步执行 + 并发队列

- (void)testConcurrent {

    dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);

    //  异步任务

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:3.0];

        NSLog(@"执行block");

    });

    NSLog(@"执行结束");

}

3. 执行结果对比

同步 + 串行(图1)

异步 + 并行(图2)

效果说明:

图1中在3s后打印了执行block和执行结束;

图2中先打印了执行结束再在3S后打印了执行block.

可以发现同步任务需要将block中的代码执行完再接着往下执行其他代码,但是异步任务在执行block的同时,下面的代码也会执行.

任务和队列的组合方式有6种,可以在文章开头的参考文章内查看

猜你喜欢

转载自blog.csdn.net/ljw2017/article/details/84314112