美文网首页
简单记录GCD的学习笔记

简单记录GCD的学习笔记

作者: ios___developer | 来源:发表于2016-11-09 09:47 被阅读0次

    一、队列和任务

    • 队列

      1.串行队列,一般使用dispatch_queue_create方法创建,并指定队列的类型DISPATCH_QUEUE_SERIAL

      2.并行队列,一般使用dispatch_queue_create方法创建,并指定队列的类型DISPATCH_QUEUE_CONCURRENT

      3.主队列,使用dispatch_get_main_queue来获取。

    • 任务

      1.同步,不开辟子线程,使用dispatch_sync将任务加入队列

      2.异步,开辟子线程,使用dispatch_async将任务加入队列

    二、实际应用

    1.延时操作
    //延时操作
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            //2.0s后要做的事
        });
    
    2.耗时操作
    //异步处理
        //获取全局并行队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            //一些异步处理,例如网络请求,和耗时操作
            NSLog(@"请求成功返回数据");
            //创建主队列
            dispatch_queue_t queueMain = dispatch_get_main_queue();
            //更新UI
            dispatch_sync(queueMain, ^{
                //更新UI操作
            });
        });
    
    3.只需要执行一次的代码,例如单例模式
    //只需要执行一次的代码
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //仅仅执行一次的代码
        });
    

    三、比较串行队列,并行队列,主队列。分别加入同步异步任务

    • 代码如下
    //创建串行队列
        dispatch_queue_t queueSerial = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
        //创建并行队列
        dispatch_queue_t queueConcurrent = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
        //获取主队列
        dispatch_queue_t queueMain = dispatch_get_main_queue();
        //将同步任务加入串行队列
        dispatch_sync(queueSerial, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
        //将同步任务加入并行队列
        dispatch_sync(queueConcurrent, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
        //将同步任务加入主队列
        //造成死锁
        dispatch_sync(queueMain, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
        //将异步任务加入串行队列
        dispatch_async(queueSerial, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
        //将异步任务加入并行队列
        dispatch_async(queueConcurrent, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
        //将异步任务加入主队列
        dispatch_async(queueMain, ^{
            NSLog(@"------%@", [NSThread currentThread]);
        });
    
    • 比较列表
    串行队列 并行队列 主队列
    同步任务 不开辟子线程,顺序执行 不开辟子线程,顺序执行 死锁
    异步任务 开辟子线程,绕行 开辟子线程,绕行 不开辟子线程,绕行

    造成死锁的情况

    1. 同步任务加入主队列

      //将同步任务加入主队列
       //造成死锁
          dispatch_sync(queueMain, ^{
              NSLog(@"------%@", [NSThread currentThread]);
          });
      

    2. 同步任务加入串行队列,在任务未结束时,调起其他同步任务。

      dispatch_sync(queueSerial, ^{
              NSLog(@"1------%@", [NSThread currentThread]);
              dispatch_sync(queueSerial, ^{
                  NSLog(@"2------%@", [NSThread currentThread]);
              });
          });
      

    相关文章

      网友评论

          本文标题:简单记录GCD的学习笔记

          本文链接:https://www.haomeiwen.com/subject/dvvzuttx.html