GCD简介

dispatch_async

异步执行,异步就是在调用了dispatch_async这个函数后立即返回,不去管里面的任务到底是怎么样执行的。
主要功能
异步任务提交:dispatch_async() 是用于将任务块(block)提交到分发队列(dispatch queue)的核心机制。
特性
1.立即返回:调用 dispatch_async() 后会立即返回,不会等待任务块的实际执行。
2.任务执行模式:
目标队列决定了任务块是以串行(serial)还是并发(concurrent)方式执行。
串行队列:任务块按顺序依次执行。
并发队列:任务块可以同时执行。
3.队列间的并发性:
不同的串行队列之间是并发处理的。

dispatch_sync

同步任务提交,dispatch_sync() 将工作项(workitem)提交到分发队列(dispatch queue),并等待工作项完成后再返回。
1.同步等待:
调用 dispatch_sync() 后会等待工作项执行完毕才返回。
2.忽略队列属性:
提交的工作项在执行时不遵循目标队列的某些属性,如自动释放频率(autorelease frequency)和服务质量(QOS class)。
3.避免死锁:
将工作项提交到当前队列会导致死锁。因此,不建议在当前队列上使用 dispatch_sync()。
使用 dispatch_sync() 也可能导致多线程死锁问题,类似于使用互斥锁(mutex)时可能出现的情况。
通常推荐使用 dispatch_async() 来避免这些问题。
4.引用管理:
dispatch_sync() 不会对目标队列进行 retain 操作。由于调用是同步的,dispatch_sync() 会“借用”调用者的引用。
5优化执行:
作为优化,dispatch_sync() 通常会在提交工作项的线程上执行该工作项,除非传递的队列是主队列(main queue)或指向主队列的队列。

队列

1.并发队列

    //手动创建了一个并发队列
    dispatch_queue_t concurrentQueue2 = dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    // 获取全局并发队列
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

2.串行队列

  //创建一个串行队列
  dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);
  //主队列也是一个串行队列
  dispatch_get_main_queue()

执行+队列 组合结果

异步提交,代码块里面的内容是最后执行的
同步提交,会先执行代码块里面的内容

同步提交任务到串行队列,任务 按顺序依次执行
异步提交任务到串行队列,任务 按顺序依次执行
同步提交任务到并发队列,任务 按顺序依次执行
异步提交任务到并发队列,任务 并发执行
异步提交任务到不同的串行队列, 任务同时执行,因为不同的串行队列是并发的
主队列是一个串行队列
同步提交任务到主队列, 死锁
异步提交任务到主队列,先执行其他任务,最后在按顺序执行提交的任务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.队列 串行队列,串行队列将任务以先进先出(FIFO)的顺序来执行,所以串行队列经常用来做访问某些特定资源的同步...
    ISwiftUI阅读 2,972评论 1 3
  • 一、简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” ...
    大基本功阅读 3,663评论 0 0
  • 之前讲过多线程之NSOperation,今天来讲讲代码更加简洁和高效的GCD。下面说的内容都是基于iOS6以后和A...
    JamesYu阅读 11,136评论 4 47
  • 一个工具,一套API的出现必定会有他的使用场景,多写代码的好处之一就是能碰到更多的这样的场景 然后才会想到使用该工...
    大饼炒鸡蛋阅读 1,891评论 0 0
  • Dispatch Queues的生成可以有这几种方式: //生成一个串行队列,队列中的block按照先进先出(FI...
    i马阅读 2,778评论 0 0