iOS-GCD使用详解及实例解析

2020-01-18 17:17:18王旭

iOS-GCD使用详解

前言

对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中渐渐放弃治疗。本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律。

线程、任务和队列的概念

iOS-GCD使用详解,iOS-GCD使用详解解析,iOS-GCD使用详解实例代码

异步、同步 & 并行、串行的特点

iOS-GCD使用详解,iOS-GCD使用详解解析,iOS-GCD使用详解实例代码

一条重要的准则

一般来说,我们使用GCD的最大目的是在新的线程中同时执行多个任务,这意味着我们需要两项条件:

    能开启新的线程

    任务可以同时执行

    结合以上两个条件,也就等价“开启新线程的能力 + 任务同步执行的权利”,只有在满足能力与权利这两个条件的前提下,我们才可以在同时执行多个任务。

    所有组合的特点

    iOS-GCD使用详解,iOS-GCD使用详解解析,iOS-GCD使用详解实例代码

    (一)异步执行 + 并行队列

    实现代码:

    
    //异步执行 + 并行队列
    - (void)asyncConcurrent{
      //创建一个并行队列
      dispatch_queue_t queue = dispatch_queue_create("标识符", DISPATCH_QUEUE_CONCURRENT);
     
      NSLog(@"---start---");
     
      //使用异步函数封装三个任务
      dispatch_async(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
      });
      dispatch_async(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
      });
      dispatch_async(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
      });
     
      NSLog(@"---end---");
    }

     打印结果:

    1 2 3 4 5 ---start---   ---end---   任务3---{number = 5, name = (null)}   任务2---{number = 4, name = (null)}   任务1---{number = 3, name = (null)}

    解释