iOS 开发 block 等待 block 或 block 等待

 block 等待


在 iOS 开发中,如果你想要一个 block(闭包)等待执行完成,通常意味着你想要同步地执行这个 block,而不是异步地。然而,block 本身并不直接支持同步等待,因为它们是作为函数对象来设计的,可以异步地传递给其他方法或函数。

在 GCD (Grand Central Dispatch) 中,你可以使用 dispatch_sync 函数来同步执行一个 block,但这通常不推荐用于主线程,因为这会阻塞主线程,导致界面无响应。

下面是一个使用 dispatch_sync 在非主线程上同步执行 block 的例子:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
dispatch_sync(queue, ^{  // 在这里执行你想要同步完成的任务  NSLog(@"This block will execute synchronously on the background queue.");  
});  
// dispatch_sync 会等待 block 执行完成后才继续执行后面的代码

请注意,如果你尝试在主线程上使用 dispatch_sync,会导致死锁,因为主线程会等待自己完成一个任务,这是不可能的。

如果你想要等待一个异步操作完成,通常的做法是使用信号量(semaphore)、回调闭包、Promise/Future 模式或者操作队列(Operation Queue)配合依赖关系。

使用信号量等待异步操作完成:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  // 执行异步任务  NSLog(@"Async task is running.");  sleep(2); // 模拟耗时操作  NSLog(@"Async task finished.");  dispatch_semaphore_signal(semaphore); // 发送信号表示任务完成  
});  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 等待信号  
NSLog(@"Continuing after async task.");

使用回调闭包等待异步操作完成:

void (^completionBlock)(void) = ^(){  // 异步任务完成后执行的代码  NSLog(@"Continuing after async task.");  
};  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  // 执行异步任务  NSLog(@"Async task is running.");  sleep(2); // 模拟耗时操作  NSLog(@"Async task finished.");  completionBlock(); // 调用回调闭包  
});

在这些情况下,重要的是要理解你的代码是如何在并发环境中运行的,并避免潜在的竞态条件和死锁。同步等待异步操作通常应该谨慎使用,因为它们可能导致线程阻塞和性能问题。 


 block 等待 block

在iOS中,你可以使用GCD(Grand Central Dispatch)来执行异步操作,并在完成时执行block。如果你想等待一个block完成,你可以使用dispatch_group_wait或者dispatch_group_notify。

以下是一个使用dispatch_group_wait的例子:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 添加异步操作到group
dispatch_group_async(group, queue, ^{// 模拟耗时操作[NSThread sleepForTimeInterval:2];NSLog(@"Block 1 完成");
});// 等待group中的所有任务完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 此处的代码会在所有block完成后执行
NSLog(@"所有block已完成");// 清理group
dispatch_release(group);

如果你想在block完成时被通知而不是等待,你可以使用dispatch_group_notify:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 添加异步操作到group
dispatch_group_async(group, queue, ^{// 模拟耗时操作[NSThread sleepForTimeInterval:2];NSLog(@"Block 1 完成");
});// 设置一个block在group中的任务完成时被通知
dispatch_group_notify(group, queue, ^{NSLog(@"所有block已完成");
});// 清理group
dispatch_release(group);

在这两个例子中,我们创建了一个group,并向其添加了一个异步任务。在第一个例子中,我们使用dispatch_group_wait来等待所有任务完成,在第二个例子中,我们使用dispatch_group_notify在任务完成时得到通知。记得在完成group的操作后释放group以避免内存泄漏。

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

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

相关文章

用SeaTunnel从SQL Server向Elasticsearch同步数据

文章目录 引言I 步骤1.1 环境准备1.2 配置JDBC插件1.3 编写SeaTunnel任务配置II Enable Sql Server CDC引言 SeaTunnel 的官网 https://seatunnel.apache.org/ Support SQL Server Version: server:2008 (Or later version for information only)Supported DataSource Info: …

抖去推无人直播+矩阵托管+AI文案撰写一体化工具如何开发搭建

一、 开发和搭建抖去推无人直播矩阵托管AI文案撰写一体化工具需要以下步骤: 确定功能需求:确定抖去推无人直播、矩阵托管和AI文案撰写的具体功能需求,如直播推流、直播管理、托管服务、AI文案生成等。 技术选型:选择适合开发该工…

LeetCode 395. 至少有K个重复字符的最长子串

解题思路 一道滑动窗口题型&#xff0c;不过滑动窗口的长度是不同种类元素的个数。 这里需要定义两个变量 cnt,overk。overk表示的是满足大于k的字符数, cnt表示的是该窗口中不同元素的个数且cnt>1&&cnt<26。 相关代码 class Solution {public int longestSub…

动手学习深度学习之环境配置

创建conda虚拟环境 下载anaconda&#xff0c;安装到计算机&#xff0c;修改镜像源到国内 show_channel_urls: true channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tu…

52. 携带研究材料(第七期模拟笔试)

52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的…

CSS3技巧38:3D 翻转数字效果

博主其它CSS3 3D的文章&#xff1a; CSS3干货4&#xff1a;CSS中3D运用_css 3d-CSDN博客 CSS3干货5&#xff1a;CSS中3D运用-2_中3d-2-CSDN博客 CSS3干货6&#xff1a;CSS中3D运用-3_css3d 使用-CSDN博客 最近工作上烦心的事情太多&#xff0c;只有周末才能让我冷静一下 cod…

LeetCode 每日一题 2024/3/11-2024/3/17

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/11 2129. 将标题首字母大写3/12 1261. 在受污染的二叉树中查找元素3/13 2864. 最大二进制奇数3/14 2789. 合并后数组中的最大元素3/15 2312. 卖木头块3/16 2684. 矩阵中移…

HTTPS(超文本传输安全协议)工作过程

一、简述HTTPS HTTPS超文本传输协议&#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#x…

对建造者模式的理解

目录 一、为什么需要建造者模式&#xff1f;1、场景12、场景23、解决上述场景的办法&#xff1a;建造者模式 二、练习1、题目描述 【[来源](https://kamacoder.com/problempage.php?pid1084)】2、输入描述3、输出描述4、输入示例5、输出示例6、参考 三、思考1、一般常用的是lo…

vue 实现下载pdf格式的文件

第一步 安装下载插件 npm install html2canvas jspdf --save第二步 给vue原型上面挂载一个下载页面pdf的方法&#xff1b;在项目工具方法存放文件夹utils中创建htmlToPdf.js文件&#xff0c;代码如下 // 导出页面为PDF格式 import html2Canvas from html2canvas import JsP…

Linux第78步_使用原子整型操作来实现“互斥访问”共享资源

使用原子操作来实现“互斥访问”LED灯设备&#xff0c;目的是每次只允许一个应用程序使用LED灯。 1、创建MyAtomicLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/”目录 输入“mkdir MyAtomicLED回车”&#xff0c;创建MyA…

Jmeter---分布式

分布式&#xff1a;多台机协作&#xff0c;以集群的方式完成测试任务&#xff0c;可以提高测试效率。 分布式架构&#xff1a;控制机&#xff08;分发任务&#xff09;与多台执行机&#xff08;执行任务&#xff09; 环境搭建&#xff1a; 不同的测试机上安装 Jmeter 配置基…

2024最新手赚手机软件APP下载排行网站源码及应用商店源码

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88898956 更…

政安晨:【深度学习处理实践】(九)—— Transformer架构

咱们接着这个系列的上一篇文章继续&#xff1a; 政安晨&#xff1a;【深度学习处理实践】&#xff08;八&#xff09;—— 表示单词组的两种方法&#xff1a;集合和序列https://blog.csdn.net/snowdenkeke/article/details/136762323 Transformer是一种架构&#xff0c;用于在…

k8s之图形界面DashBoard【九】

文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 镇场 9. DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&…

vscode jupyter 如何关闭声音

网上之前搜的zen模式失败 仅仅降低sound失败 #以下是成功方式&#xff1a; 首先确保user和remote的声音都是0&#xff1a; 然后把user和remote的以下设置都设置为off就行了&#xff01; 具体操作参考 https://stackoverflow.com/questions/54173462/how-to-turn-off-or-on-so…

从大模型到Agentscope——分布式Multi-Agent应用开发与部署

目录 Why需要分布式 案例 多进程的分布书版本能快速提升速度 分布式的挑战 AgentScope分布式解决 方案 实现RPC Agent 基于Actor模式的并行调度缺点&#xff1a;需要Agent内部决定消息传递目标 被调用的Agent立即返回占位符placeholder to_dist: 开启自动将单机进行扩展…

5 分钟小工具:使用 dive 分析 docker 镜像

需求 拿到一个镜像之后&#xff0c;我想知道&#xff1a; 分层查看镜像里都有哪些文件各层使用了什么命令构建的这个镜像镜像里比较大的文件有哪些&#xff08;可能需要优化&#xff09; dive 工具介绍 dive 工具可以做这些分析。dive 的 github 地址是 wagoodman/dive&…

观察者模式的理解和引用

1.前言 在之前的H5小游戏中&#xff0c;对于长连接发送的不同类型数据包的处理&#xff0c;是通过switch语句进行处理的&#xff0c;于是在自己的代码中出现了大量的case分支&#xff0c;不方便进行维护和后期的版本迭代。于是在老师的指导下&#xff0c;开始寻求使用观察者模…

SpingBoot集成Rabbitmq及Docker部署

文章目录 介绍RabbitMQ的特点Rabbitmq术语消息发布接收流程 Docker部署管理界面说明Overview: 这个页面显示了RabbitMQ服务器的一般信息&#xff0c;例如集群节点的名字、状态、运行时间等。Connections: 在这里&#xff0c;可以查看、管理和关闭当前所有的TCP连接。Channels: …