理解dispatch_async

news2024/11/20 7:06:45

在这里插入图片描述

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 中的任务,这是一个耗时操作;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS之块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…

Java面试八股之子类可以从父类继承哪些内容

Java子类可以从父类继承哪些内容 Java子类可以从父类继承以下内容&#xff1a; 属性&#xff08;Fields/Variables&#xff09;&#xff1a; public&#xff1a;子类可以继承父类所有的public修饰的属性。 protected&#xff1a;子类可以继承父类所有的protected修饰的属性…

1052 卖个萌(测试点1,2)

solution 想要输出\需要用\\才能输出&#xff0c;即 cout << "Are you kidding me? \\/" << endl;测试点1&#xff0c;2&#xff1a;输入序号小于1的非法情况 #include<iostream> #include<string> #include<map> using namespace…

XX食品有限公司智能制造汇报材料(71页PPT)

材料介绍&#xff1a; 本食品有限公司为应对市场需求变化&#xff0c;提高生产效率与产品质量&#xff0c;降低运营成本&#xff0c;特制定此智能制造规划。本规划旨在通过引入先进的智能制造技术和管理模式&#xff0c;推动公司向数字化、网络化、智能化方向发展&#xff0c;…

强烈推荐!Windows 11 24H2 版本系统下载(新功能多多)

微软向 Windows 11 Version 24H2 用户推送了 KB5036908 更新&#xff0c;标志着 24H2 版本的首次累积更新&#xff0c;更新后用户的系统版本号将升级至 26100.268。在新版本中&#xff0c;最显著的变化包括对文件资源管理器的改进、整合的 Copilot 功能、编辑 PNG 文件元数据的…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第38课-密室逃脱

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第38课-密室逃脱 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

echarts的toolbox自定义feature标签及事件

1. 需求 在使用echarts图时希望toolbox扩展一些自定义icon和点击事件&#xff0c;而不只是图中这些echarts提供的事件。 2. 文档 属性名类型描述toolbox.featureObject各工具配置项。 feature中除了echarts提供的各个内置的工具按钮外&#xff0c;可以自定义工具按钮。 除…

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

ShardingSphere跨表查询报错

目录 一、场景简介二、报错信息三、SQL四、原因五、解决方法一、调整SQL&#xff0c;不使用子查询方法二、将子查询的SQL独立出来&#xff0c;后续连接逻辑由代码处理 一、场景简介 1、使用ShardingSphere按月份进行分表 2、单月查询正常&#xff08;单表&#xff09; 3、跨…

苹果AI一夜颠覆所有,Siri史诗级进化,内挂GPT-4o

苹果AI一夜颠覆所有&#xff0c;Siri史诗级进化&#xff0c;内挂GPT-4o 刚刚&#xff0c;苹果AI&#xff0c;正式交卷&#xff01; 今天&#xff0c;苹果构建了一个全新AI帝国——个人化智能系统Apple Intelligence诞生&#xff0c;智能助手Siri迎来诞生13年以来的史诗级进化…

visual studio 2022使用全版本平台工具集

https://www.cnblogs.com/coolfan/p/15822057.html vs2022使用全版本平台工具集 关键词&#xff1a;visual studio 2022使用全版本平台工具集;vs2022使用vc60、vc6.0工具集;vs2022使用全部旧平台工具集 优点&#xff1a;用v60平台工具集编译出来的exe文件可以无依赖的运行在W…

Spring--Bean的作用域,生命周期

Bean的作用域 Bean的作用域有很多种&#xff0c;在Spring Framework中支持6种&#xff08;其中有四种只有在web环境中才能生效&#xff09;&#xff0c;同时Spring还支持自定义Bean的范围。 Spring Framework中支持的6种范围&#xff1a; 作用域解释singleton每个Spring IoC…

Manav Garg:生成式人工智能时代的SaaS

随着Chatgpt推动的人工智能时代精神席卷全球&#xff0c;它将如何影响SaaS世界&#xff1f;SaaS创业公司将如何适应这个新时代&#xff1f; 新兴市场在哪里&#xff1f;虽然这种技术平台的转变将带来巨大的机会&#xff0c;但传统的印度SaaS剧本必须适应新的人工智能秩序。创始…

误操作全盘重新分区?数据恢复与防范策略全解析

一、全盘重新分区概述 全盘重新分区&#xff0c;指的是对硬盘或存储设备上的所有分区进行删除并重新创建新分区的操作。这一操作通常会导致原有分区中的数据被清除&#xff0c;给用户带来数据丢失的风险。在某些情况下&#xff0c;用户可能由于误操作或软件故障而进行了全盘重…

【ArcGISProSDK】OpenItemDialog打开文件对话框

打开单个文件 效果 代码 public async void OpenFunction() {// 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;OpenItemDialog openItemDialog new OpenItemDialog() { Title "打开要素文件",InitialLocation gdbPath,Filter ItemFilte…

2024军民两用智能装备技术展会:领略“5G边缘计算器”开启智能化数据处理新篇章

"占星者5G边缘计算器&#xff1a;开启智能化数据处理新篇章" 随着物联网和人工智能技术的迅猛发展&#xff0c;数据处理的需求日益增长&#xff0c;对计算设备的性能提出了更高的要求。在“2024年中国军民两用智能装备与通信技术产业展览会”上&#xff0c;占星者5G边…

教育小程序开发:技术实现与实践案例

随着信息技术的不断进步&#xff0c;教育小程序在教育领域的应用越来越广泛。教育小程序开发不仅可以提高教学效率&#xff0c;还能够提供个性化的学习体验。本文将以技术代码为例&#xff0c;详细介绍教育小程序开发的关键技术和实践案例&#xff0c;帮助开发者更好地理解和实…

数据结构与算法题目集(中文) 6-3 求链表的表长

该代码使用循环遍历链表来计算链表的长度。代码首先定义了一个整数变量i用于计数&#xff0c;并初始化为0。然后进入一个while循环&#xff0c;条件为链表L非空。在循环中&#xff0c;通过L L->Next来遍历链表中的每一个节点&#xff0c;并将计数变量i递增。最终返回计数变…

企业管理/市场经营/自我管理,500+个经典职场工具 . rar

​500N个实用管理工具包&#xff0c;精选人力资源从业者必备之132项工具、40个管理者实效管理工具、成功自我管理的29个工具、常见的9种营销分析工具等&#xff0c;成功自我管理必备工具。 与班主任联系&#xff0c;即可获得完整资料包&#xff01; 1.PEST分析 2.五力分析 3.…

大一学生分享网络编程聊天室-简单私聊

每天过得充实&#xff0c;你将不会焦虑 ---同行者联盟 Socket 是一种规范(标准)&#xff0c;封装了TCP协议的通信细节&#xff0c;使得我们使用它就可以完成与远端计算机的TCP链接&#xff0c;以及数据的传输。并且可以完成数据传输基于双向流的读写操作&#xff0c;Java语言…