[Swift 开发] @MainActor 自动主线程更新UI

news/2024/9/18 7:52:22/

DispatchQueue.main.async

在Swift中编写异步代码时,你可能会遇到一些并发性和线程安全性的问题

例如刷新UI需要在主线程,在Swift 5.5之前我们都是使用手动来刷新主线程,这样既麻烦又容易遗漏

DispatchQueue.global().async {// 在后台线程执行耗时任务DispatchQueue.main.async {// 在主线程上更新用户界面}
}

@MainActor

Swift 5.5 引入了一个新的属性包装器 @MainActor,它提供了一种简单而安全的方式来在主线程上执行代码。

@MainActor 的原理是,它将属性或方法标记为只能在主队列(主线程)上执行。这意味着使用 @MainActor 修饰的代码块只能在主线程上运行,任何试图在其他线程上调用该代码块的尝试都将被阻塞,直到在主线程上运行。

使用 @MainActor 的语法很简单。你可以将它应用于属性或方法,示例代码如下:

class MyViewController: UIViewController {@MainActorvar data: [String] = []@MainActorfunc updateUI() {// 更新用户界面的代码}
}

在上面的代码中,data 属性和 updateUI() 方法都被标记为 @MainActor。这意味着任何试图在非主线程上修改 data 属性或调用 updateUI() 方法的尝试都将被阻塞,直到在主线程上执行。

@MainActor 还可以应用于函数的参数,用于指示该参数必须在主线程上调用。例如:

@MainActor
func processUserInput(@MainActor completion: () -> Void) {// 处理用户输入的代码completion() // 在主线程上调用完成闭包
}

在上面的例子中,completion 参数被标记为 @MainActor,这意味着传递给该函数的闭包必须在主线程上调用。

@MainActor标记过的代码,只会在主线程中执行,所以就不会有concurrency(并发)的问题了

通过使用 @MainActor,你可以更轻松地确保你的代码在正确的线程上执行

在UIKit中使用@MainActor

现在我们看UIKit的API,都已经用@MainActor标记了。

当我们在使用UIKit时,即便不用DispatchQueue.main.async,也能确保在主线程上执行。

@MainActor open class UIButton : UIControl, NSCoding {} @MainActor open class UILabel : UIView, NSCoding, UIContentSizeCategoryAdjusting {}@MainActor open class UIView : UIResponder, NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate {}// more

 在我们封装UIKit自定义控件时,为了保证线程安全,也需要@MainActor装饰


http://www.ppmy.cn/news/400092.html

相关文章

机械硬盘计算机管理,机械硬盘怎么分区

最近有小伙伴想对电脑进行整理,对内存进行分区,但是不知道如何操作。接下来小编来教大家如何对机械硬盘进行分区吧。 首先在Windows界面下就可以用系统自带工具进行分区。单击“开始”按钮,并右键单击“开始”菜单中的“计算机”选项&#xf…

mysql垂直分区和水平分区

数据库扩展大概分为以下几个步骤: 1、读写分离:当数据库访问量还不是很大的时候,我们可以适当增加服务器,数据库主从复制的方式将读写分离; 2、垂直分区:当写入操作一旦增加的时候,那么主从数据…

Linux 磁盘管理-分区管理-磁盘分区【gdisk】gpt分区工具使用介绍

gdisk -l [设备] gdisk又叫GPT fdisk,算是fdisk的延伸吧,主要使用的是GPT分区类型,用来划分容量大于2T的硬盘。 扩展1:分区类型GPT和MBR。GPT最大支持18EB(1EB1024PB,1PB1024TB),MBR…

MySQL表分区

学到这儿,边学边测,简要记录一下,以下代码都在mysql8.0下实测过。 关于分区以及为什么要分区水平分区的几种类型及demo1.range分区2.list分区3.hash分区3.1.常规hash3.2.线性hash 4.key分区5.子分区(复合分区)6.columns分区 关于分区以及为什…

【P12】TL431可调正负直流双电源线性稳压电路

可调正负双电源线性稳压一般使用 317/337 集成稳压芯片,我常用安森美的,因为在我用过的芯片中最稳定,对于一些电压比较低的操作,很多厂商也都有不同的芯片。 使用 TL431做线性稳压也不是出于别的目的,首先是我在项目中…

Python+Appium实现自动化测试的使用步骤

这篇文章主要介绍了PythonAppium实现自动化测试的使用步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一、环境准备 1.脚本语言:Python3.x IDE&am…

【跑实验02】如何提取名称相同的部分,比如obj365_train_000000000002.xml,换成相应的坐标格式

文章目录 一、问题的提出二、问题的解决2.1 解决问题2.2 把bboxes写入txt文件中 一、问题的提出 我有一个文件格式如下所示: obj365_train_000000000002.xml: 236, 41, 263, 180 obj365_train_000000000002.xml: 218, 174, 248, 207 obj365_train_000000000002.xm…

【安卓开发——Dart语法讲解】

文章目录 Dart语法详解1. 入口方法2. Dart变量3. Dart的命名规则4. Dart 常量5. 数据类型5.1 数值类型5.1.3 运算符5.2 字符串类型5.3 布尔类型5.4 List集合类型5.4.1 第一种定义List的方式5.4.2 第二种定义List的方式5.4.3 指定list的类型 5.5 Maps类型5.5.1 第一种定义方式5.…

JavaScript 鼠标事件、图片跟随鼠标移动。键盘事件

鼠标事件对象 event 对象代表事件的状态 跟事件相关的一系列信息的集合 现阶段 我们主要是用 鼠标事件对象 mouseEvent 和键盘事件对象KeyboardEvent 图片跟随鼠标移动 <body><img src"images/h_h.jpg" alt""><!-- <img src"im…

Android软键盘弹出导致页面背景图片上移问题

1、期望的效果&#xff1a; 输入法弹起时&#xff0c;背景图不要向上移动或压缩输入法弹起时&#xff0c;不要遮挡输入框&#xff0c;输入框可以向上移动&#xff1b; 2、实现方式&#xff1a; 1、在AndroidManifest.xml 中设置对应Activity的输入法模式&#xff1a; andro…

[C#]键盘↑↓←→控制图片加速移动

想做简单游戏的同学们可以学习一下。 [C#]键盘控制图片移动(10秒) 源码 using System; using System.Drawing; using System.Windows.Forms;namespace 键盘控制移动CS {public partial class Form1 : Form {public Form1() {InitializeComponent();}int 左右;int 上下;double …

pygame--图片随键盘移动

练习pygame 以下代码为&#xff1a;制作贪吃蛇游戏的练习作业&#xff0c;图片随着键盘的上下左右而相应的移动 import pygame# 定义画布的大小 W 900 H 700 size (W, H) back (255, 255, 255) # 背景色 screen pygame.display.set_mode(size) # 创建一个窗口 pygame…

移动端h5页面软键盘弹出后 背景图片被顶上去

移动端h5页面在软键盘弹出后&#xff0c;body的高度被压缩了&#xff0c;就导致原本高度100%的背景图被顶上去一截&#xff0c;需要把div的高度强行设回100%才能解决这个问题 <div class"app" :style"{ height: bodyHeight px }"></div>moun…

判断键盘图片

有时候不想输入键盘图片怎么办&#xff1f; //判断是否是键盘图片 (BOOL)isContainsEmoji:(NSString *)string { __block BOOL isEomji NO; [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences us…

键盘快捷键示意图制作

键盘快捷键示意图制作 图片制作使用软件&#xff1a;http://www.keyboard-layout-editor.com/#/ 我制作的office快捷键示意图 &#xff08;如果有人找到做下图的软件&#xff0c;地址可否告诉我&#xff01;&#xff09; 与上上图相比&#xff0c;上图还是比较的好看&#xf…

键盘扫描码大全

键盘扫描码 作者&#xff1a; ~江湖猎人~ 来源&#xff1a; 博客园 发布时间&#xff1a;2009-08-30 11:28 阅读&#xff1a;279 次 原文链接 [收藏] //以下是一个检测按键扫描码的程序 &#xff03;i nclude <bios.h>&#xff03;i nclude <stdlib.h>&am…

Qt键盘事件实现图片在窗口上下左右移动

Qt键盘事件实现图片在窗口上下左右移动 标签&#xff08;空格分隔&#xff09;&#xff1a; 键盘事件 一、项目内容&#xff1a; 新建桌面应用程序testKeyEvent&#xff0c;类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘的时候窗口中的图片上下左右移动&#xff…

7-python库之-pyautogui鼠标键盘控制、图片位置查找

还是在自动化上面的应用&#xff0c;对于web的测试可以使用selenium来获取元素&#xff0c;进行按键控制或者文字输入&#xff0c;模拟用户操作实现自动化。可是对于非web的win桌面应用&#xff0c;我们就没办法了&#xff0c;这时候就需要向按键精灵那样&#xff0c;去查找对应…

python pyautogui 控制键盘鼠标 识别图片 颜色

还有pynput库可以监听键盘鼠标 # 参考文档 https://www.pianshen.com/article/7555171409/ https://blog.csdn.net/commentq/article/details/106004115 #其他库 pynput pwinauto pywin32 import pyautogui def run():pyautogui.FAILSAFE True# 鼠标移动左上角终止程序size …

键盘墙纸

点击图片看大图。