① dispatch_group 异步执行任务

  • 现有以下调度组 dispatch_group 执行多个任务,将 dispatch_group_notify 放在调度组异步执行任务,那么它们的任务执行顺序是怎么样的呢?
 dispatch_group_t group = dispatch_group_create();dispatch_queue_t queue = dispatch_get_global_queue(0, 0);dispatch_group_enter(group);dispatch_async(queue, ^{sleep(1);NSLog(@"任务1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue, ^{NSLog(@"任务2");dispatch_group_leave(group);});dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"任务3:主线程更新UI");});NSLog(@"任务4:主线程正在执行");
  • 执行程序,结果如下:
 任务4:主线程正在执行任务2任务1任务3:主线程更新UI
  • 分析:

    • dispatch_group 执行任务开始时, 程序由上到下执行任务1、任务2、任务3、任务4;
    • 由于任务4没有在调度组中,因此优先执行;
    • 然后有两个调度组异步执行任务1和任务2,最后再通知主线程执行任务3;
    • 由于第一个任务1中线程sleep(1),因此任务2会比任务1优先完成;
    • 最后再通知主线程执行任务3,更新UI。

② 如果将 dispatch_group_notify 移动到最前面,能否执行?执行结果是怎样的呢?

  • 代码修改如下:
 dispatch_group_t group = dispatch_group_create();dispatch_queue_t queue = dispatch_get_global_queue(0, 0);dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"任务3:主线程更新UI");});dispatch_group_enter(group);dispatch_async(queue, ^{sleep(1);NSLog(@"任务1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue, ^{NSLog(@"任务2");dispatch_group_leave(group);});NSLog(@"任务4:主线程正在执行");
  • 执行结果如下:
 任务4:主线程正在执行任务2任务3:主线程更新UI任务1
  • 可以看到程序能正常执行,但是只要有 enter-leave 成对匹配,notify 就会执行,不会等两个调度组都执行完毕,即只要 enter-leave 成对程序就可以执行。

③ 再加一个enter,即 enter:wait 是 3:2,能否执行 notify ?

  • 修改代码如下:
 dispatch_group_t group = dispatch_group_create();dispatch_queue_t queue = dispatch_get_global_queue(0, 0);dispatch_group_enter(group);dispatch_async(queue, ^{sleep(1);NSLog(@"任务1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue, ^{NSLog(@"任务2");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"任务3:主线程更新UI");});NSLog(@"任务4:主线程正在执行");
  • 执行结果如下:
 任务4:主线程正在执行任务2任务1
  • 可以看到,程序不能正常执行完毕,会一直等待,这是因为等待 leave 的执行,最后才会执行 notify。
  • 如果 dispatch_group_enter 比 dispatch_group_leave 多,由于 value 不等于 dsema_orig 不会走到唤醒逻辑, dispatch_group_notify 中的任务无法执行或者 dispatch_group_wait 收不到信号而卡住线程。

④ 如果是 enter:wait 是 2:3,能否执行 notify ?

  • 修改代码如下:
 dispatch_group_t group = dispatch_group_create();dispatch_queue_t queue = dispatch_get_global_queue(0, 0);dispatch_group_enter(group);dispatch_async(queue, ^{sleep(1);NSLog(@"任务1");dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue, ^{NSLog(@"任务2");dispatch_group_leave(group);});dispatch_group_leave(group);dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"任务3:主线程更新UI");});NSLog(@"任务4:主线程正在执行");
  • 执行程序之后,可以看到程序会延迟崩溃在任务1的 dispatch_group_leave(group),这是因为 enter-leave 没有成对匹配,dispatch_group 没有 enter 却需要 leave,导致 value 不等于 dsema_orig 不会执行唤醒逻辑。

iOS经典面试题之分析GCD的dispatch_group任务执行问题相关推荐

  1. iOS经典面试题之分析self class与super class的区别和底层原理

    一.self 和 super 的区别 [self class] 是类的一个隐藏参数,每个方法的实现的第一个参数即为 self,就是发送消息 objc_msgSend,消息接收者是 self,方法编号 ...

  2. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  3. 李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理

    李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理 问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入行的 ...

  4. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  5. 李洪强iOS经典面试题144-数据存储

    李洪强iOS经典面试题144-数据存储   数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...

  6. 李洪强iOS经典面试题37-解释垃圾回收的原理

    李洪强iOS经典面试题37-解释垃圾回收的原理 问题 我们知道,Android 手机通常使用 Java 来开发,而 Java 是使用垃圾回收这种内存管理方式. 那么,ARC 和垃圾回收对比,有什么优点 ...

  7. iOS经典面试题总结--内存管理

    内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1 ...

  8. iOS经典面试题大全

    1.INTERVIEW 共勉 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题.面试经验,讨 ...

  9. 整理一篇iOS经典面试题大全

    ###1.INTERVIEW 共勉 ###2.iOS developers 方向 ###3.INTERVIEW QUESTION 1.深copy和浅copy 浅拷贝: 1.对内存地址的复制,让目标对象 ...

最新文章

  1. 用iPhone给林徽因拍照会是啥样?这款“穿越相机”把老照片换成现代风
  2. mysql 统计条目_mysql 统计表中条目数量的几种方法
  3. java spring工作原理_SpringMVC的工作原理是什么样的,跟Spring的关系是怎么样的?
  4. Redis各特性的应用场景
  5. 数据库设计方法、规范与技巧
  6. Python语言编程规范与优化建议
  7. Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
  8. java中replaceall用法_Java中String的ReplaceAll使用小结
  9. Luogu3444:[POI2006]ORK-Ploughing
  10. SVN 使用beyondcompare 来版本对比
  11. 微信收款没有提示通知消息,怎么打开?解决方案
  12. C. Balanced Stone Heaps
  13. 常用贴片器件正负极区分
  14. 印度软件外包领军企业上演安然门
  15. CM3基础(持续更新)
  16. 武汉坚守第二十二天——谣言与辟谣与慌乱
  17. Pytorch深度学习(一):前馈神经网络(FNN)
  18. Python 面向对象
  19. WIFI等无线射频产品为什么要校准?
  20. redflag Dc5.0,Asianux2安装时无法创建文件系统,缺少scsi驱动解决办法

热门文章

  1. 【洛谷 2330】繁忙的都市
  2. 关于css浮动的一点思考
  3. sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片
  4. selenium自动化测试、Python单元测试unittest框架以及测试报告和日志输出
  5. 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)
  6. 使用AOP+Annotation实现操作日志记录
  7. 静态库与动态库(一):概述
  8. 统计代码行数_推荐一波代码量、行数、提交量、作者等全维度统计神器
  9. 每日程序C语言3-三个数大小排序
  10. 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...