Swift 團(tuán)隊又一重磅開源項目
作為 Swift 向安全、簡單和高性能異步編程邁進(jìn)的一部分,Swift 核心團(tuán)隊引入了一個新的算法包:AsyncSequence。這個算法包被稱為 Swift Async Algorithms,現(xiàn)在已開源并可以在 GitHub 上獲取 https://github.com/apple/swift-async-algorithms。
這個包有三個主要目標(biāo):
與 async/await 的集成
為基于時間的算法提供一個歸宿
跨平臺和開源
目標(biāo)
AsyncAlgorithms 是一個算法包,用于處理隨時間變化的值。這包括主要與時間有關(guān)的算法,例如 debounce 和 throttle,還包括有關(guān)順序的算法,例如 combineLatest 和 merge。使用多個輸入的操作(如 zip 對 Sequence 所做的操作)實現(xiàn)起來可能非常復(fù)雜,需要考慮微妙的行為和許多邊緣情況。共享包可以通過大量測試和文檔來正確處理這些細(xì)節(jié),以造福所有 Swift 應(yīng)用程序。
AsyncAlgorithms 的基礎(chǔ)能力已經(jīng)包含在 Swift 5.5 的 AsyncSequence 中。Swift 5.5 還帶來了使用自然 for/in 循環(huán)和 await 來處理 AsyncSequence 和序列等效 API(如 map 和 filter)中的值的能力。結(jié)構(gòu)化并發(fā)允許我們編寫中間狀態(tài)只是一個局部變量的代碼,try 可以直接用于拋出異常的函數(shù),并且異步代碼的邏輯與同步代碼類似。
我們相信開源包將為這些 API 提供一個很好的歸宿。軟件包使開發(fā)人員可以靈活地跨平臺和操作系統(tǒng)版本進(jìn)行部署。開發(fā)和 API 設(shè)計將在 GitHub 和 Swift 論壇上進(jìn)行。
簡要概覽
該軟件包包括常用算法的 AsyncSequence 版本,例如:
Zip
CombineLatest
Merge
Chain
Buffer
Debounce
Throttle
讓我們從 zip 開始。與其對應(yīng)的序列一樣,zip 生成由來自兩個不同 AsyncSequence 的值組成的元組:
for await (number, letter) in zip(numbers, letters) {
print(number, letter)
}
AsyncSequence 支持 rethrows,這意味著錯誤處理就像使用 try 一樣簡單——與任何其他 Swift 代碼一樣:
do {
for try await (number, letter) in zip(numbers, lettersWithErrors) {
print(number, letter)
}
} catch {
// Handle error
}
其他算法,如 combineLatest 和 merge 也組合了幾個 AsyncSequence 的輸出。每個都對輸出的類型和時間提供不同類型的控制。
Sequence 和 AsyncSequence 的一個根本區(qū)別是引入了時間變量。基于 proposals to standardize Clock and Duration 這個 proposal https://github.com/apple/swift-evolution/blob/main/proposals/0329-clock-instant-duration.md ,該軟件包添加了 debounce 和 throttle 等算法。它們?yōu)槌R姴僮魈峁┖唵巍㈤_箱即用的解決方案,例如丟棄過快到達(dá)的值:
for await value in input.debounce(for: .seconds(0.5)) {
// Handle input, at most once per 0.5 seconds.
}
在有限的異步序列中等待所有值的收集通常很有用。這個包提供了初始化器,只需一行代碼即可:
let result = await Array(input)
async 函數(shù)對于將同步序列與 AsyncSequence 結(jié)合起來很有用。在這里,我們將它與 chain 函數(shù)一起使用來為文件的內(nèi)容添加前導(dǎo):
let preamble = [
"http:// This source file is part of the Swift.org open source project"
"http://"
""
].async
let lines = chain(preamble, URL(fileURLWithPath: "/tmp/Sample.swift").lines)
for try await line in lines {
print(line)
}
Combine
Apple 在 iOS 13 和 macOS 10.15 SDK 中引入了 Combine 框架。從那時起,我們就有機(jī)會了解如何在現(xiàn)實場景中使用 Combine。通過 AsyncAlgorithms,我們可以應(yīng)用這些能力,并采用 Swift 的新結(jié)構(gòu)化并發(fā)特性。
Combine API 基于 Publisher 和 Subscriber 接口,通過操作符在它們之間進(jìn)行連接。它的設(shè)計重點是提供一種以聲明方式指定這些運算符鏈的方法,在數(shù)據(jù)從一端移動到另一端時對其進(jìn)行轉(zhuǎn)換。這需要對中間狀態(tài)進(jìn)行不同的思考。有時這會導(dǎo)致調(diào)用站點比人們預(yù)期的更復(fù)雜——尤其是在處理需要共享的單個值、錯誤或數(shù)據(jù)時。async/await 的結(jié)構(gòu)化并發(fā)為我們提供了一種新的方式來表達(dá)這種邏輯。我們現(xiàn)在可以編寫異步代碼,將其分成更小的部分并從上到下讀取,而不是作為一系列鏈?zhǔn)睫D(zhuǎn)換。
我們對 async/await 和 AsyncSequence 為語言帶來的可能性感到興奮。我們相信這個包將是探索該領(lǐng)域更高級別 API 的未來發(fā)展和演變的好地方。
下一步是什么
Swift 官方現(xiàn)在發(fā)布了 Swift 異步算法包的原型版本。目的是通過有效的實現(xiàn)來啟動項目,然后在 Swift 論壇上進(jìn)行詳細(xì)的設(shè)計討論。歡迎社區(qū)參與:
早期采用該軟件包和對設(shè)計的反饋
包的實現(xiàn)
測試的實施
包未來的宣傳和演變
官方也正在使用 GitHub 問題來跟蹤錯誤、功能請求和啟動任務(wù)。
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取
