18:swift-并发
正文
mport UIKit class Complicate18VC: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white self.title = "18:并发" // 2:任务是可以作为你程序一部分异步运行的工作单位。所有异步代码都会作为某任务的一部分运行。 Task { await testAsynFunc() print("aaaa") } print("bbbbb") // 3:任务组 TaskGroup // 4: 行为体,线程安全 Task { let logger = TemperatureLogger(label: "Outdoors", measurement: 25) print(await logger.max) } /* 5:可发送类型 Sendable 任务和行为体可以让你将程序拆分成能够安全并发执行的小部分。在一个任务或者行为体实例中,包含可变状态的那部分程序,比如变量和属性,就被叫做并发域。某些种类的数据不能在并发域之间共享,因为那些数据包含了可变状态,却又没有针对重叠访问进行防护。 可以在并发域之间进行共享的类型,就是所谓的可发送类型。 */ } /* 1:定义异步函数 要标记对应函数或者方法是异步的,你在声明中形式参数的后面使用 async 关键字, 和你使用 throw 关键字一样。 如果函数或者方法返回值,就把 async 写在返回箭头( -> )之前。比如说,这里是你可能写的在相册中获取照片名称方法: */ // 异步函数 func testAsynFunc() async { await Task.sleep(2 * 1_000_000_000) // Two seconds print("异步函数") } } /* 4:**** 行为体 actor 使用 actor 关键字引入行为体,跟着是它写在一对花括号中的定义。 TemperatureLogger 行为体拥有其他行为体外代码可以访问的属性,并且限制了 max 属性只能是行为体内代码才能更新最大值。 */ actor TemperatureLogger { let label: String var measurements: [Int] // 访问max private(set) var max: Int init(label: String, measurement: Int) { self.label = label self.measurements = [measurement] self.max = measurement } }