其它相关内容请见虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记
苹果系统借助现代处理器的多核可同步执行多条代码,提升同一时间内程序所能执行的任务。例如,一段代码从网上下载文件,另一段代码可以在屏幕上显示进度。此时,我们不能等待第一个执行完后再执行第二个,而必须要同步执行这两个任务。
要并行处理代码,系统将代码单元分组成任务。在Swift中,任务可以通过异步和并发编程实现。异步编程是一种编程模式,代码在完成任务前等待处理完成。这样系统可以在不同进程间共享计算资源。等待期间,系统可使用资源执行其它任务。而并发编程实现的代码可以利用多核同步执行多个任务。
图9-1:异步和并发编程
因很多应用可以同时运行,系统并不会对每个应用分配指定的核数。系统会创建一些执行线程,将任务分配给这些线程,然后根据可用资源决定哪个核执行哪些线程。在图9-1的示例中,左边是一个异步任务,从网上加载图片然后在屏幕上显示。在等待服务响应时,线程处于空闲状态可以执行其它任务,因此系统可以使用它执行更新进度条的任务。右图中创建了并发任务,因此在不同进程中同步执行。
任务
异步和并发的代码由任务定义。Swift标准库中包含有Task
结构体用于创建和管理这些任务。下面是结构体的初始化方法:
- Task(priority: TaskPriority?, operation: Closure):这个初始化方法创建并运行新任务。
priority
参数是一个辅助系统决定何时执行任务的结构体。这一结构体中包含类型属性定义标准优先级。当前有background
、high
、low
、medium
、userInitiated
和utility
。operation
参数是一个闭包,内含任务执行的语句。
Task
结构带有如下属性用于取消任务。
- isCancelled:该属性返回一个表示任务是否被取消的布尔值。
- cancel():取消任务的方法。
还有一些类型属性和方法,可用于从当前任务获取信息或创建执行指定处理的任务。以下是最常用的。
- currentPriority:该属性返回当前任务的优先级。这是一个
TaskPriority
结构体,有属性background
、high
、low
、medium
、userInitiated
和utility
。 - isCancelled:该属性返回一个表示当前任务是否取消的布尔值。
- sleep(nanoseconds: UInt64):本方法按照
nanoseconds
参数指定的时间挂起当前任务。
虽然可以在代码的任意地方创建Task
结构体初始化异步任务,SwiftUI自带了如下的修饰符在视图出现时进行创建。
- task(priority: TaskPriority, Closure):此修饰符在视图出现时执行第二个参数所指定的任务。
priority
参数是一个结构体,辅助系统决定何时执行任务。值有background
、high
、low
、medium
、userInitiated
和utility
。 - task(id: Value, priority: TaskPriority, Closure):此修饰符在视图出现