引言

随着移动应用服务复杂性不断增加,处理并发操作变得越来越重要。在 Swift 5.5 中引入一个全新的特性,即 Swift Actor角色),它为我们提供了一种简单安全并发编程模型本篇博客将深入探索 Swift 中的 Actor 模型,并介绍它在实际开发中的运用场景和优势。

Actor 基本原理

  1. Actor 是一种并发编程模型,它通过限制只有一个线程可以访问 Actor 内部状态来保证线程安全
  2. Actor 内部的状态只能由 Actor 自身的方法进行修改,其他线程无法直接访问修改
  3. Actor 之间通过异步消息传递进行通信,确保了线程安全性 

actor关键字构建Actor, 和class. structenum区别

  1. actor和class都是引用类型
  2. Actor 和 Class 区别在于 Actor 遵守了 Actor 协议,可以保证在并发环境操作数据的安全性
  3. Actor 不支持继承
  4. 都有方法属性构造方法
  5. 可以遵循协议
  6. 所有的方法属性都是static,因为没有self概念

 

Actor 的定义访问 

  1. 在 Swift 中,我们可以使用 actor 关键字来定义一个 Actor 类。
  2. Actor 类中方法默认异步的,并且可以通过 nonisolated 关键字将某些方法标记为非隔离的,以便可以在 Actor 外部进行调用
  3. 通过在方法前添加 async 关键字,我们可以在 Actor 内部进行异步操作
  4. Actor 内部的状态可以通过声明privatefileprivate 来确保只有 Actor 内部可以访问
  5. 通过使用 await 关键字,我们可以等待 Actor 方法的结果,并确保线程安全。
  6. Actor 的状态修改只能在 Actor 内部进行,这样可以避免竞态条件数据访问冲突

 

测试例子

// 创建对象
actor MyActor {
    private var sharedArr = [1,2,3,4,5]

    // 读取数据
    func readData() async -> [Int] {
        return sharedArr
    }

    // 添加数据
    func writeData(value: Int) async {
        sharedArr.append(value)
    }
    
    // 删除数据
    func removeData() async {
        sharedArr.removeLast()
    }
}

 测试异步读写数据

// 创建 MyActor 实例
let myActor = MyActor()

 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 异步写入共享数据
Task {
    await myActor.writeData(value: 10)
    print("write Data 10")
}

// 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 结果
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// write Data 10
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// read data: 10
// 异步读写数据,数据安全

 测试异步读取删除数据

// 异步删除共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 异步删除共享数据
Task {
    for _ in (0...2){
        await myActor.removeData()
        print("remove Data")
    }
}

// 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
    print(await myActor.readData())
}

// 结果
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// read data: 1
// read data: 2
// read data: 3
// remove Data
// read data: 4
// remove Data
// read data: 5
// remove Data
// [1, 2]

 因为在线程中,打印数据顺序固定,结果保证了线程安全

 结论

通过引入 Swift Actor,Swift 语言提供了一种简单且安全的并发编程模型,使得开发者可以更轻松

 

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

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

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

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

发表回复

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