什么是@globalActor
之前介绍了Actor, 使用Actor时需要创建并引用这个对象。 如果像单例那样在整个工程中使用,就用到了@globalActor
初始化global actors
全局actor是一种具有@globalActor
属性的类型,它包含一个名为shared
的static
属性,该属性提供行为者的共享实例。例如:
@globalActor
public struct myGlobalActor {
public actor MyActor { }
public static let shared = MyActor()
}
global actors 类型可以是结构、枚举、Actor或final
类。它本质上只是一个标记类型,通过shared
提供对Actor实例的访问。共享实例就是一个单例对象,用于同步访问或修改Actor注释的任何代码或数据。
@MainActor是一个特殊的@globalActor
@globalActor
public actor MainActor {
public static let shared = MainActor(...)
}
看@MainActor的初始化方法,它被@globalActor标记过的,它本身是一个特殊的globalActor
区别:@MainActor只会在主线程中执行,@globalActor不会改变当前线程
@globalActor的使用
@myGlobalActor var arrs = [1,2,3]
@myGlobalActor func myAsyncFunction() async {}
@myGlobalActor class myClass {}
@globalActor
public struct myGlobalActor {
public actor myActor { }
public static let shared = myActor()
}
@myGlobalActor
var arr = [1,2,3]
@myGlobalActor
func myAsyncFunction(_ num:Int) async {
print("Function: (num) 开始")
arr.append(4)
print("Function: (num) 完成")
}
@myGlobalActor
class myClass {}
Task {
await myAsyncFunction(1)
}
Task {
await myAsyncFunction(2)
}
Task {
await myAsyncFunction(3)
}
// 打印结果:
// Function: 1 开始
// Function: 1 完成
// Function: 2 开始
// Function: 2 完成
// Function: 3 开始
// Function: 3 完成
- 定义一个符合
GlobalActor
协议的类型,该协议规定了执行器的行为和能力。 - 在全局范围内使用
@myGlobalActor
注解来指定默认的全局执行器。 - 在异步代码块中,Swift 编译器会自动使用指定的全局执行器来调度和执行异步操作。
从打印结果看出,线程都是同步执行的,保证了数据不会被同时读写
需要注意的是,@globalActor
属性只在 Swift 5.5 或更高版本中可用。
原文地址:https://blog.csdn.net/u010130947/article/details/131286085
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_47880.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。