在 Swift 5.5 中,终于加入了言语等级的异步处理 async/await,这应该会让用回调闭包写异步调用方法年代彻底完毕了!

这篇文章就简略总结一下这个功用运用吧。

异步函数

所谓异步,是相对于同步而言,这是一种履行使命的方法,同步的履行使命,使命需求一个一个的次序履行,前边的好了,后边的才干运转。而异步就不是这样,它不需求等待当前使命履行完结,其他使命就能够履行。

在 Swift 5.5 中,增加了 async 关键字,标记这个函数是一个异步函数。

func getSomeInfo() async -> String { ... }
/// 能够抛出错误的异步函数
func getSomeInfoWithError() async throws -> String { ... }

这儿需求注意的是,假如咱们想调用异步函数,就必须在其他异步函数或者闭包里边运用 await关键字。

func runAsyncFunc() async {
    let info = await getSomeInfo()
    ...
}
func runAsyncErrorFunc() async throws {
    let info = try await getSomeInfoWithError()
    ...
}

实际运用异步函数的时分,咱们是无法在同步函数里运用的,这时Swift会报错。要运用的话,就需求咱们要供给了一个异步履行的环境 Task

func someFunc() {
    Task {
        runAsyncFunc()
    }
}

异步序列

假如一个序列中的每个信息都是通过异步获取的,那么就能够运用异步序列的方法遍历获取。前提是序列是遵守AsyncSequence协议,只要在for in 中增加 await关键字。

let asyncItems = [asyncItem1, asyncItem2, asyncItem3]
for await item in asyncItems { ... }

多个异步一起运转

这个能够运用叫做异步绑定的方法,便是在每个存储异步回来信息的变量前边增加async

async let a = getSomeInfo()
async let b = getSomeInfo()
async let c = getSomeInfo()
let d = await [a, b, c]
...

这时运转的情况便是 a b c 是一起履行的,也便是所说的并行履行异步使命,即并发。

结构化并发

上边在说到在同步函数中运用异步函数,咱们需求增加一个Task,来供给异步运转的环境。 每个 Task 都是一个单独使命,里边履行一些操作,这操作能够是同步也能够是异步。多个使命履行时,能够把它们增加到一个使命组TaskGroup中,那么这些使命就有了相同的父级使命,而这些使命Task又能够增加子使命,这样下来,使命之间就有了清晰的层级联系,这也便是所谓的结构化并发

使命和使命组

使命组能够更为细节的处理结构化并发,运用方法如下,就在使命组中增加单个使命即可。

func someTasksFunc() {
    Task {
        await withTaskGroup(of: String.self) { group in
            group.addTask { 
                let a = await getSomeInfo()
                ...
            }
            group.addTask {
                let b = await getSomeInfo()
                ...
            }
        }
    }
}

从运转的方法来说,这种运用使命组的情况和异步绑定的效果一样,简略的异步使命,完全能够运用异步绑定的方法。而使命和使命组是为更为杂乱的并发情况供给支持,比方使命的优先级,履行和取消等。

假如异步函数是可抛出错误的,运用withThrowingTaskGroup就行。

解决数据竞争的Actor

在并发过程中,对于同一特点数据的读取或者写入,有时会有古怪的成果,这些因为在不同的线程,一起进行了操作。消除这种问题的方法,便是运用 Swift 供给的 Actor类型。 一个和类差不多的类型,但是对自身可变内容进行了阻隔。

actor SomeInfo {
    var info: String
}

外部在拜访其info特点时,actor 做了阻隔,每次只能一个线程拜访,直接拜访就会报错。而且外部不能进行修正,只有内部才干修正。

外部拜访方法便是需求异步履行,在异步环境中,添await

let content = SomeInfo(info: "abc")
let info = await content.info)
...

总结

以上便是Swift 5.5 async/await的简略运用了。了解了这些,就能够日常开发中代替闭包回调,告别回调阴间和处理不完的 completionHandler了。
现在官方已经在已有闭包回调处理异步的当地,都增加async异步版别,自行检查文档了解吧。。

别的附上一些很有协助的文章地址,这些当地都有更为翔实的阐明,参考学习起来!

Swift 5.5 有哪些新功用?

www.hackingwithswift.com/articles/23…

Swift 并发开始

onevcat.com/2021/07/swi…

并发

swiftgg.gitbook.io/swift/swift…