美文网首页
简单记录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的学习笔记

    一、队列和任务 队列1.串行队列,一般使用dispatch_queue_create方法创建,并指定队列的类型DI...

  • 简单的GCD学习笔记

    在GCD苹果官方文档第一句话就是: Execute code concurrently on multicore ...

  • 一 GCD初识

    1.GCD基础概念(此笔记为学习Objective-C高级编程书中第三章所记录的相关知识点) gcd为异步执行任务...

  • GCD 线程安全同步-信号量

    GCD 线程安全同步 学习、记录与分享 GCD 与 NSThread比较 GCD会自动利用更多的CPU内核、 会自...

  • 关于gcd

    这几天有点时间,就把gcd研究了一下。现把心得和笔记记录如下 gcd常用的api,dispatch_queue_c...

  • GCD的简单学习

    GCD,全称 Grand Central Dispatch,异步执行任务技术之一,开发者只需要定义想执行的任务并追...

  • GCD学习记录

    同步 vs. 异步同步函数在任务完成后才会将控制权返回给调用者。异步函数会立即返回,不会等待任务完成。因此异步函数...

  • iOS初级编程之GCD的简单使用

    GCD的简述就不过多强调了(网上一搜一大把!)这篇文章主要是记录和学习GCD并学会简单调用。希望能对大家有所帮助...

  • iOS多线程-GCD 附带GCD相关代码

    多线程学习笔记-GCD 我把这篇文章所用到的代码总结到这里->GCD项目总结下载地址-GCD-wxk可以下载参考 ...

  • Google Protocol buffer 学习笔记.上篇-简

    本次分上下两篇简单记录自己对protobuf协议的学习笔记, 上篇简单介绍protobuf, 记录了ubuntu系...

网友评论

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

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