什么是@globalActor

之前介绍了Actor,  使用Actor需要创建引用这个对象。 如果像单例那样在整个工程中使用,就用到了@globalActor

初始化global actors 

全局actor是一种具有@globalActor属性的类型包含一个名为sharedstatic属性,该属性提供行为者的共享实例例如

@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可以用在类、结构体、属性、函数 等等

@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 完成
  1. 定义一个符合 GlobalActor 协议类型,该协议规定了执行器行为能力
  2. 全局范围内使用 @myGlobalActor 注解指定默认全局执行器
  3. 异步代码块中,Swift 编译器自动使用指定全局执行器调度执行异步操作

打印结果看出,线程都是同步执行的,保证了数据不会被同时读写
需要注意的是,@globalActor 属性只在 Swift 5.5 或更高版本可用

原文地址:https://blog.csdn.net/u010130947/article/details/131286085

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47880.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注