理解dispatch_async

在这里插入图片描述

Submits a block for asynchronous execution on a dispatch queue and returns immediately.
提交一个块以在调度队列上异步执行并立即返回

code showing

  • 以一个最简单的demo开始
// 创建一个同步队列
dispatch_queue_t syncQueue = dispatch_queue_create("io.sqi.MySyncQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"0️⃣ zero, current thread: %@", [NSThread currentThread]);
// 使用 dispatch_async 在 syncQueue 上异步执行
dispatch_async(syncQueue, ^{
NSLog(@"2️⃣ 2nd, current thread: %@", [NSThread currentThread]);
});
NSLog(@"1️⃣ 1st, current thread: %@", [NSThread currentThread]);

在主线程上执行以上代码, 运行结果如下:

0️⃣ zero, <_NSMainThread: 0x60000170c000>{number = 1, name = main}
1️⃣ 1st, <_NSMainThread: 0x60000170c000>{number = 1, name = main}
2️⃣ 2nd, <NSThread: 0x6000017427c0>{number = 7, name = (null)}

可以看到,为了异步执行 block, 系统开辟了一条 number = 7 的新线程


  • 加入同步执行任务
// 创建一个同步队列
dispatch_queue_t syncQueue = dispatch_queue_create("io.sqi.MySyncQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"0️⃣ zero, current thread: %@", [NSThread currentThread]);
// 使用 dispatch_async 在 syncQueue 上异步执行
dispatch_async(syncQueue, ^{
NSLog(@"1️⃣ 1st, current thread: %@", [NSThread currentThread]);
});
// 使用 dispatch_sync 在 syncQueue 上同步执行
dispatch_sync(syncQueue, ^{
NSLog(@"2️⃣ 2nd, current thread: %@", [NSThread currentThread]);
});
NSLog(@"3️⃣ 3rd, current thread: %@", [NSThread currentThread]);

在主线程上执行以上代码, 运行结果如下:

0️⃣ zero, <_NSMainThread: 0x6000017080c0>{number = 1, name = main}
1️⃣ 1st, <NSThread: 0x60000171c940>{number = 5, name = (null)}
2️⃣ 2nd, <_NSMainThread: 0x6000017080c0>{number = 1, name = main}
3️⃣ 3rd, <_NSMainThread: 0x6000017080c0>{number = 1, name = main}

因为2nd需要同步执行,所以 2nd 的执行要在 3rd 前面,因为1st是先加入 syncQueue, 所以 1st 的执行要在 2nd 前面


  • 变更为并发队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("io.sqi.MyConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"0️⃣ zero, current thread: %@", [NSThread currentThread]);
// 使用 dispatch_async 在 concurrentQueue 上异步执行
dispatch_async(concurrentQueue, ^{
NSLog(@"1️⃣ 1st, current thread: %@", [NSThread currentThread]);
});
// 使用 dispatch_sync 在 concurrentQueue 上同步执行
dispatch_sync(concurrentQueue, ^{
NSLog(@"2️⃣ 2nd, current thread: %@", [NSThread currentThread]);
});
NSLog(@"3️⃣ 3rd, current thread: %@", [NSThread currentThread]);

同样在 main thread 上执行,运行结果如下:

// 情况一
0️⃣ zero, <_NSMainThread: 0x600001708000>{number = 1, name = main}
2️⃣ 2nd, <_NSMainThread: 0x600001708000>{number = 1, name = main}
1️⃣ 1st, <NSThread: 0x6000017537c0>{number = 5, name = (null)}
3️⃣ 3rd, <_NSMainThread: 0x600001708000>{number = 1, name = main}
// 情况二
0️⃣ zero, <_NSMainThread: 0x600001708000>{number = 1, name = main}
2️⃣ 2nd, <_NSMainThread: 0x600001708000>{number = 1, name = main}
3️⃣ 3rd, <_NSMainThread: 0x600001708000>{number = 1, name = main}
1️⃣ 1st, <NSThread: 0x6000017537c0>{number = 5, name = (null)}
  1. 因为是并发队列,1st 无需等待 2nd 执行完毕才开始,可以同时执行;
  2. dispatch_sync 不具备开启新线程的能力,所以依旧需要在 main thread 上执行;
  3. 为什么 2nd 总是在 3rd 的前面 ?

    分析如下:首先 dispatch_async 将任务放入队列中后立即返回,不阻塞当前线程,所以 2nd 总是会立即执行,而 dispatch_async 提交的队列的 block 需要开辟新的线程以执行 block 中的任务,这是一个耗时操作;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.结构体

目录 一、普通结构体&#xff08;struct&#xff09;1.1 说明1.2 举例1&#xff09;结构体定义及访问2&#xff09;结构体初化的简单写法3&#xff09;结构体更新语法 二、元组结构体&#xff08;tuple struct&#xff09;2.1 概念2.2 示例 三、类单元结构体&#xff08;unit-l…

程序猿大战Python——容器——字符串

字符串介绍 什么是Python容器 目标&#xff1a;了解Python容器是什么&#xff1f; 在现实生活中&#xff0c;我们知道容器是用来存放东西的&#xff0c;比如实验室里的烧杯等。 类似的&#xff0c;在Python中的容器是用来存放数据的。 与此同时&#xff0c;为了操作方便&…

Java毕业设计 基于springboot vue大学生助学贷款管理系统

Java毕业设计 基于springboot vue大学生助学贷款管理系统 SpringBoot 大学生助学贷款管理系统 功能介绍 学生 登录 注册 个人中心 修改密码 个人信息 助学贷款 申请贷款 放贷信息 还贷信息 公告资讯 学校 登录 注册 个人中心 修改密码 个人信息 助学贷款管理 申请贷款管理 公…

java:mybatis查询时自动添加tenantId和deleted查询条件

# 参考资料 https://blog.csdn.net/chenhz2284/article/details/139606486?spm1001.2014.3001.5502 # 示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>&l…

纳税信用评级:企业的“金字招牌”

在快速发展的市场经济中&#xff0c;企业的信用状况越来越成为其竞争力的重要组成部分。而在税务领域&#xff0c;纳税信用评级更是衡量一个企业是否诚信经营的重要指标。今天&#xff0c;就让我们一起来深入了解纳税信用评级的相关知识。 一、纳税信用评级是什么&#xff1f;…

Python中的钩子函数(hooks)介绍使用

什么是hook&#xff1f; 钩子函数&#xff0c;顾名思义&#xff0c;就是把我们自己实现的自定义函数在某一时刻挂接到目标挂载点上去执行。 1. hook函数&#xff0c;就是我们自己实现的函数&#xff0c;函数类型与挂载点匹配&#xff08;返回值&#xff0c;参数列表&#xff0…

Fake news detection: A survey of graph neural network methods

abstract 各种社交网络的出现产生了大量的数据。捕获、区分和过滤真假新闻的有效方法变得越来越重要&#xff0c;特别是在 COVID-19 大流行爆发之后。本研究对假新闻检测系统的图神经网络 (GNN) 的现状和挑战进行了多方面、系统的回顾&#xff0c;并概述了使用 GNN 实现假新闻…

C++STL初阶(4):初识vector

vector是一个类模版&#xff0c;是一个顺序容器&#xff0c;底层思维就是顺序表&#xff0c;而顺序表的本质就是一个可以改变size的数组。本篇基于string的学习基础&#xff0c;我们对vector进行一个大致的了解和学习 1.基本介绍 1. vector 是表示可变大小数组的序列容器&#…

老生常谈!程序员为什么要阅读源代码?

大家好&#xff0c;我是码农先森。 阅读源码这是一个老生常谈的话题了&#xff0c;但又是很多人想做又没有付出行动的事情。前段时间我研究了 Swoole 的源代码&#xff0c;并且输出了系列的源码分析文章「感兴趣的朋友可以翻阅以前的文章」。虽然这个过程很枯燥和艰难&#xf…

css font-family

知乎的font-family的设置理解 -apple-system, BlinkMacSystemFont 这两个值是为了确保在macOS和iOS系统上能够使用系统默认字体进行文本渲染。-apple-system特别为Safari浏览器设计&#xff0c;而BlinkMacSystemFont则主要针对基于Chromium的浏览器&#xff08;如Chrome&#…

【Linux】shell——条件判断test,各种运算符,expr

条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与&#xff0c;前面为真后面才会执行 || -->逻辑或&#xff0c;前面为假后面才…

京东网页html+css简单制作1(附带源码和素材)

一.代码效果展示 代码html骨架结构分为头部top,颈部banner&#xff0c;中间部分main,腿部fortet-image,尾部fortter&#xff0c;五部分组成&#xff0c;从上至下&#xff0c;从左到右结构。&#xff08;总体因为没设计版心&#xff0c;所以位置比较乱&#xff09; 其中中部mai…

云动态摘要 2024-06-11

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠,新用户1折起! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用 最新产品更新 云服务器运维监…

设计模式-代理模式(结构型)

代理模式 代理模式是一种结构型模式&#xff0c;它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址&#xff0c;负责将请求转发给代理类&#xff0c;并且可以在转发前后做一些处理 图解 角色 抽象主题&#xff08;Subject&#xff09;: 定义代理对象和被代理…

【安卓13 源码】Input子系统(2) - input系统与应用进程通信

点击手机屏幕&#xff0c;可以分发input 事件到对应的view&#xff0c;由上一节知道input 是运行在system 进程的&#xff0c;那应用进程与系统进程是如何通讯的呢&#xff0c;相信本文可以给到一点小小的答案。 先给个结论&#xff1a;应用在resume 的时候才去建立与input 服…

项目部署(前后端)

一&#xff1a;多环境概念&#xff1a; 借鉴来源&#xff1a;多环境设计_程序员鱼皮-多环境设计-CSDN博客 为什么需要多环境&#xff1a; 第一个例子&#xff1a;我们可以设想&#xff0c;我们肯定玩过王者荣耀&#xff0c;且王者荣耀也一直在不断更新&#xff0c;如果按我们…

cleanmymac清理时要一直输入密码 CleanMyMac X一直提示输入密码的解决方案

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统。 在使用Cle…

【人工智能基础学习】Andrew Ng-机器学习基础笔记

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

HyperSnap软件最新版下载-HyperSnap官方最新版附加详细安装步骤

​HyperSnap是一个老牌优秀的屏幕截图工具&#xff0c;全新界面&#xff0c;不仅能抓取标准桌面程序&#xff0c;还能抓取 DirectX, 3Dfx Glide的 游戏视频或 DVD 屏幕图&#xff0c;能以 20 多种图形格式&#xff08;包括&#xff1a;BMP, GIF,JPEG, TIFF, PCX等&#xff09;保…

鸿蒙开发:应用组件跨设备交互(流转)【跨端迁移】

跨端迁移 概述 在用户使用设备的过程中&#xff0c;当使用情境发生变化时&#xff08;例如从室内走到户外或者周围有更适合的设备等&#xff09;&#xff0c;之前使用的设备可能已经不适合继续当前的任务&#xff0c;此时&#xff0c;用户可以选择新的设备来继续当前的任务&a…