iOS经典面试题之分析GCD的dispatch_group任务执行问题
① 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任务执行问题相关推荐
- iOS经典面试题之分析self class与super class的区别和底层原理
一.self 和 super 的区别 [self class] 是类的一个隐藏参数,每个方法的实现的第一个参数即为 self,就是发送消息 objc_msgSend,消息接收者是 self,方法编号 ...
- 李洪强iOS经典面试题153- 补充
李洪强iOS经典面试题153- 补充 补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...
- 李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理
李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理 问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入行的 ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强iOS经典面试题144-数据存储
李洪强iOS经典面试题144-数据存储 数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...
- 李洪强iOS经典面试题37-解释垃圾回收的原理
李洪强iOS经典面试题37-解释垃圾回收的原理 问题 我们知道,Android 手机通常使用 Java 来开发,而 Java 是使用垃圾回收这种内存管理方式. 那么,ARC 和垃圾回收对比,有什么优点 ...
- iOS经典面试题总结--内存管理
内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1 ...
- iOS经典面试题大全
1.INTERVIEW 共勉 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题.面试经验,讨 ...
- 整理一篇iOS经典面试题大全
###1.INTERVIEW 共勉 ###2.iOS developers 方向 ###3.INTERVIEW QUESTION 1.深copy和浅copy 浅拷贝: 1.对内存地址的复制,让目标对象 ...
最新文章
- 用iPhone给林徽因拍照会是啥样?这款“穿越相机”把老照片换成现代风
- mysql 统计条目_mysql 统计表中条目数量的几种方法
- java spring工作原理_SpringMVC的工作原理是什么样的,跟Spring的关系是怎么样的?
- Redis各特性的应用场景
- 数据库设计方法、规范与技巧
- Python语言编程规范与优化建议
- Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
- java中replaceall用法_Java中String的ReplaceAll使用小结
- Luogu3444:[POI2006]ORK-Ploughing
- SVN 使用beyondcompare 来版本对比
- 微信收款没有提示通知消息,怎么打开?解决方案
- C. Balanced Stone Heaps
- 常用贴片器件正负极区分
- 印度软件外包领军企业上演安然门
- CM3基础(持续更新)
- 武汉坚守第二十二天——谣言与辟谣与慌乱
- Pytorch深度学习(一):前馈神经网络(FNN)
- Python 面向对象
- WIFI等无线射频产品为什么要校准?
- redflag Dc5.0,Asianux2安装时无法创建文件系统,缺少scsi驱动解决办法
热门文章
- 【洛谷 2330】繁忙的都市
- 关于css浮动的一点思考
- sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片
- selenium自动化测试、Python单元测试unittest框架以及测试报告和日志输出
- 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)
- 使用AOP+Annotation实现操作日志记录
- 静态库与动态库(一):概述
- 统计代码行数_推荐一波代码量、行数、提交量、作者等全维度统计神器
- 每日程序C语言3-三个数大小排序
- 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...