[Swift 开发] @globalActor

什么是@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 或更高版本中可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值