GCD总结

一.队列:这里的队列指执行任务的等待队列,即用来存放任务的队列。


截屏2019-11-25下午3.33.07.png

二.在队列中加入任务
1.队列中 添加 异步调用的任务,并执行:


WeChatb25754c387545517b9850be5214b22b6.png

2.队列中 添加 同步调用的任务,并执行:


WeChat85ae90e50299d48e899b68085ab1f637.png

三、注意: 并发队列不具备开启新线程能力,异步调用任务具备开启新线程功能,
所以并发队列中添加同步执行多个任务时也只能依次执行

四、GCD其他方法
1.GCD栅栏:dispatch_barrier_async
我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。这样我们就需要一个相当于 栅栏 一样的一个方法将两组异步执行的操作组给分割起来,当然这里的操作组里可以包含一个或多个任务。


WeChat5cd70c31f784940a9e49b6459109d638.png

2.GCD延时执行:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2.0 秒后异步追加任务代码到主队列,并开始执
});

3.GCD 一次性代码(只执行一次):dispatch_once


WeChat82590a98918eed2b04486d2e8fa77aa8.png
  1. GCD 队列组:dispatch_group
    有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。
    .调用队列组的 dispatch_group_async 先把任务放到队列中,然后将队列放入队列组中。或者使用队列组的 dispatch_group_enter、dispatch_group_leave 组合来实现 dispatch_group_async。
    .调用队列组的 dispatch_group_notify 回到指定线程执行任务。或者使用 dispatch_group_wait 回到当前线程继续向下执行(会阻塞当前线程)。


    WeChat3eaf8971943871e3a68db7569a7b5650.png

    dispatch_group_wait:

  • 暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。


    WeChat4fc3a226882406e38bb1de1e7bbe577e.png

5.线程锁:semaphore


WeChat1351ae3e4e6409fa08e7f11af68eba40.png

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

推荐阅读更多精彩内容

  • 本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲...
    花花世界的孤独行者阅读 3,440评论 0 1
  • GCD 的使用步骤 GCD 的使用步骤其实很简单,只有两步。 创建一个队列(串行队列或并发队列)将任务追加到任务的...
    CDLOG阅读 1,553评论 0 0
  • 1 什么是GCD? Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较...
    藤王俊采阅读 1,943评论 0 1
  • 章节目录 什么是GCD? 如何在多条路径中执行CPU命令列? 即使多线程存在很多问题(如数据竞争、死锁、线程过多消...
    DrunkenMouse阅读 4,328评论 1 13
  • 1.NSTimer不准时的原因:(1).RunLoop循环处理时间,每次循环是固定时间,只有在这段时间才会去查看N...
    稻春阅读 5,022评论 0 3