登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [ios]swift 在线程中操作 ui 的新旧两种方式     [回主站]     [分站链接]
[ios]swift 在线程中操作 ui 的新旧两种方式
clq
浏览(418) - 2023-09-14 18:07:53 发表 编辑

关键字:

[ios]swift 在线程中操作 ui 的新旧两种方式

最新的 5.5 很简单,函数或者闭包、gcd、代码版本、匿名函数前加上修饰 @MainActor 即可。



https://blog.csdn.net/u010130947/article/details/131223845

[Swift 开发] @MainActor 自动主线程更新UI
文件夹_IOS
已于 2023-06-15 14:56:13 修改 1482
收藏
文章标签: swift MainActor
版权
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 {
@MainActor
var data: [String] = []

@MainActor
func 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装饰


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
swift 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1