Swift 新 async/await 同步机制小技巧:消除“多余”的 await 关键字

news2024/10/7 10:11:06

在这里插入图片描述

概览

在使用多个Actor 共同实现同步功能的时候,我们往往会看到如下使用场景:

Actor A 必须在主线程上运行,Actor B可以在任意线程上运行,但需要适时的调用 Actor A 中的方法。

在这种情况下,我们会遇到如下代码:

在这里插入图片描述

如上代码所示,需要在 worker.doing() 调用前加上 await 关键字,毕竟此时可能会发生任务挂起和切换。

其实,我们还有一种更好的方法来完成 working.doing() 方法的调用,下面就让我们来看看如何操作吧。 😉


代码解析

示例的源代码如下,非常简单:

@MainActor
class Worker {
    func doing() {
        print("important working...")
    }
}

actor Superman {
    unowned let worker: Worker!
    
    init(worker: Worker) {
        self.worker = worker
    }
    
    func todo() {
        Task {
            await worker.doing()
        }
    }
}

我们看到 Worker 类必须在主线程上保持同步,而 Superman 可以在任意线程上进行同步,但需要调用 Worker 中的 doing() 方法。

除了使用 await 关键字修饰 worker.doing() 方法之外,我们还可以显式让 Swift 明白我们的 Task 闭包代码必须在主线程上执行。

解决之道

在 Swift 推出新 async/await 并发模型的同时,Apple 同样对闭包调用做了升级。

现在,我们可以在闭包中添加新的 @MainActor 关键字来明确闭包内容必须在主线程上运行。

于是乎,上面的代码就可以修改为如下形式:

actor Superman {
    unowned let worker: Worker!
    
    init(worker: Worker) {
        self.worker = worker
    }
    
    func todo() {
        Task { @MainActor in
            worker.doing()
        }
    }
}

我们成功的“摆脱”了 await 关键字,并且让意图更加明显。

总结

其实,我们并没有真正摆脱 await 关键字,任务切换仍然会和原来一样发生,只不过我们不再关心,只要看到闭包中的 @MainActor 关键字,一切都了然了,不是吗?

感谢观赏,再会 ! 😃

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

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

相关文章

从移动激光扫描数据中自动提取单棵树的双重生长方法

论文题目:A dual growing method for the automatic extraction of individual trees from mobile laser scanning data Abstract 在城市场景的杂乱点云中,街道树木与其他物体交织在一起,阻碍了对单个树木的自动提取。根据树木的一般构成&a…

React:安装配置使用scss

目录 前言: 1.暴露隐藏的webpack配置; 2.安装sass的相关包; 3.项目中新建一些scss文件; 4.在config文件夹中找到webpack.config.js文件,进行配置; 5.测试使用; 前言: 项目采用…

Python之Pandas的常用技能【写入数据】

1、背景: 最近在工作中遇到越来越多的的使用pandas或者python来处里写入操作,尤其是对excel文件或者csv文件的操作更是常见,这里将写入操作总结如下,方便记忆,也分享给大家,希望对阅读者能够有所帮助 2、…

nvdiffrec:Extracting Triangular 3D Models, Materials, and Lighting From Images

论文主页 https://nvlabs.github.io/nvdiffrec/git主页 https://github.com/NVlabs/nvdiffrec新闻报道 https://redian.news/wxnews/36324YuQiao0303 读后感 https://blog.csdn.net/qq_34342853/article/details/125622816b站演示效果视频 https://www.bilibili.com/video/BV1P…

8天获offer|祝贺信息技术老师获CSC资助赴意大利访学

I老师拟申报CSC青年骨干教师项目,指定欧洲学校,且要求半个月内获得邀请函。我们8天就取得了意大利帕多瓦大学的offer,研究方向完全相符,因而顺利通过了CSC审批。后经繁琐的手续,I老师最终获得签证,如期出国…

ABB机器人设置有效载荷的2种方法具体步骤(直接输入法+自动识别推算法2)

ABB机器人设置有效载荷的2种方法具体步骤(直接输入法+自动识别推算法2) 为什么要设置有效载荷Loaddata? 对于搬运应用的机器人只有设定正确的工具和载荷数据,机器人才能正确的工作; 对于搬运比较重的产品,或工具的重量也比较重,需要设置工具及搬运对象的重心和重量; …

2023年黑马Java入门到精通教程--程序流程控制

程序流程控制 程序执行的几种常见形式 分支结构 If分支 根据判定的结果(真或假)决定执行某个分支的代码 If分支的作用 If分支有三种格式 switch分支 也是匹配条件去执行分支, 适合做值匹配的分支选择,结构清晰,格式良好 swit…

通信原理笔记—基带信号的检测与最佳接收

目录 在加性白高斯噪声信道条件下数字基带信号的接收: 加性高斯白噪声干扰下的信号检测: 最大似然判决准则:误码率最小意义上的最佳判决: 先验等概及最佳判决时的误码率计算: 高斯噪声干扰下二进制信号的检测&…

Mock.js(简单代替后台)

Mock.js (官网http://mockjs.com/)是一款模拟数据生成器,旨在帮助前端开发人员独立于后端进行开发,帮助编写单元测试。二、为什么使用mockjs在做开发时,当后端的接口还未完成,前端为了不影响工作效率&#…

【实际开发12】- Utils / tools

目录 1. 自定义工具类 概念 / 解析 1. 构建方式 1. XxxClassl 类 public xxx() → new XxxClass() 2. XxxClassl 类 public static xxx() → XxxClass.xxx() 2. Interface 1. public interface XxxMapper → private final XxxMapper 2. public interface IXxxService →…

面经八,笔试加面试

Java 开发面试题,尧壁信科有限公司 笔试: 1、Java 中有几种类型的流? 字节流字符流,输入流输出流 2、什么是 java反射? 在程序的运行状态中,对于任意一个类,都可以知道整这个类的所有属性和方法&#xf…

如何锁定Excel表格的公式不被修改

很多小伙伴在制作Excel表格的时候,往往还会设置很多公式,但如果不小心或被他人随意修改了公式,就会造成数据错误,为了避免这种情况,其实我们可以设置保护,让公式锁定无法被修改。 下面举一个例子来看看如何…

【C语言 数据结构】串

文章目录串类型的定义串的表示和实现定长顺序存储堆分配存储表示串的块链存储表示串的模式匹配算法字串的定位函数匹配模式的改进算法串类型的定义 对于由多个字符(≥ 0)组成的字符串(例如 http://data.biancheng.net)&#xff0…

Git版本如何使用命令进行升级(win10)

1、桌面鼠标右键,点击Git Bash Here,输入git --version 查看目前Git版本。 2、输入git update-git-for-windows 升级版本,再输入y同意升级并覆盖之前的版本。 我在版本升级的过程中遇到了error: RPC failed; curl 92 HTTP/2 stream 0 was not…

SaaS-API越权漏洞检测系统

概述通过替换认证信息后重放请求,并对比数据包结果,判断接口是否存在越权漏洞特点支持HTTPS自动过滤图片/js/css/html页面等静态内容多线程检测,避免阻塞支持输出报表与完整的URL、请求、响应安装和使用安装依赖git clone https://github.co…

Eyeshot 2023 测试版,离发行版不远了

Eyeshot 2023 测试版 这个 Beta 版本来得太晚了,因为我们决定放弃许多客户不喜欢的 v2022 GEntities。该产品已根据以下架构进行了完全重构。例如,使用 Eyeshot 2023 可以非常轻松地在 Web 项目中使用没有 UI 的产品。这也简化了从 Eyeshot 2021 版的项…

【软件测试】6年资深测试总结的,测试人常常犯的9大误区,背锅不存在的......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 1、把原型设计、UI效…

Chapter3:机器人系统设计

ROS1{\rm ROS1}ROS1的基础及应用,基于古月的课,各位可以去看,基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本:ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic;实际机器人:Ha…

无忧·企业文档自助配置完成单点登录配置,对接企业原有组织架构

我作为企业文档的产品负责人,常常被问及企业文档和其他在线文档有啥差不一样的地方?我大致总结了下,有几个方面:1、企业文档定位于企业内部的内容管理工具,侧重于私有化部署。核心的是数据的控制权在企业自己手中&…

类和对象-对象特性

前言:主要讲述对象的初始化与清理,构造函数与析构函数,其分类和调用,以及调用时机等相关内容对象的初始化与清理:1.生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用的时候也会删除一些自己的信…