简单记录GCD的学习笔记

一、队列和任务

  • 队列

    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的学习笔记)