AsyncStream
聲明
struct AsyncStream<Element>
概述
AsyncStream 符合 AsyncSequence ,提供了一種方便的方法來創建異步序列,而無需手動實現異步迭代器。特別是,異步流是 well-suited 以適應基於回調或委托的 API 以參與 async - await 。
您使用接收 AsyncStream.Continuation 的閉包初始化 AsyncStream 。在此閉包中生成元素,然後通過調用延續的 yield(_:) 方法將它們提供給流。當沒有其他元素要生成時,調用延續的 finish() 方法。這會導致序列迭代器生成 nil ,從而終止序列。延續符合 Sendable ,這允許從 AsyncStream 迭代之外的並發上下文調用它。
任意元素來源可以比調用者迭代它們消耗的更快地生成元素。因此,AsyncStream 定義了一種緩衝行為,允許流緩衝特定數量的最舊或最新元素。默認情況下,緩衝區限製為 Int.max ,這意味著該值是無界的。
調整現有代碼以使用流
要調整現有回調代碼以使用 async - await ,請使用回調為流提供值,方法是使用延續的 yield(_:) 方法。
考慮一個假設的 QuakeMonitor 類型,它在每次檢測到地震時為調用者提供 Quake 實例。為了接收回調,調用者將自定義閉包設置為監視器的 quakeHandler 屬性的值,監視器會根據需要回調該屬性。
class QuakeMonitor {
var quakeHandler: ((Quake) -> Void)?
func startMonitoring() {…}
func stopMonitoring() {…}
}
要使其適應使用 async - await ,請擴展 QuakeMonitor 以添加類型為 AsyncStream<Quake> 的 quakes 屬性。在此屬性的 getter 中,返回一個 AsyncStream ,其 build 閉包 - 在運行時調用以創建流 - 使用延續執行以下步驟:
-
創建一個
QuakeMonitor實例。 -
將監視器的
quakeHandler屬性設置為一個閉包,該閉包接收每個Quake實例並通過調用延續的yield(_:)方法將其轉發到流。 -
將延續的
onTermination屬性設置為在監視器上調用stopMonitoring()的閉包。 -
在
QuakeMonitor上調用startMonitoring。
extension QuakeMonitor {
static var quakes: AsyncStream<Quake> {
AsyncStream { continuation in
let monitor = QuakeMonitor()
monitor.quakeHandler = { quake in
continuation.yield(quake)
}
continuation.onTermination = { @Sendable _ in
monitor.stopMonitoring()
}
monitor.startMonitoring()
}
}
}
因為流是 AsyncSequence ,所以調用點可以使用 for - await - in 語法來處理流產生的每個 Quake 實例:
for await quake in QuakeMonitor.quakes {
print ("Quake: \(quake.date)")
}
print ("Stream finished.")
可用版本
相關用法
- Swift AsyncStream first(where:)用法及代碼示例
- Swift AsyncStream prefix(_:)用法及代碼示例
- Swift AsyncStream drop(while:)用法及代碼示例
- Swift AsyncStream max(by:)用法及代碼示例
- Swift AsyncStream dropFirst(_:)用法及代碼示例
- Swift AsyncStream reduce(_:_:)用法及代碼示例
- Swift AsyncStream prefix(while:)用法及代碼示例
- Swift AsyncStream allSatisfy(_:)用法及代碼示例
- Swift AsyncStream contains(_:)用法及代碼示例
- Swift AsyncStream min()用法及代碼示例
- Swift AsyncStream contains(where:)用法及代碼示例
- Swift AsyncStream flatMap(_:)用法及代碼示例
- Swift AsyncStream init(_:bufferingPolicy:_:)用法及代碼示例
- Swift AsyncStream init(unfolding:onCancel:)用法及代碼示例
- Swift AsyncStream filter(_:)用法及代碼示例
- Swift AsyncStream compactMap(_:)用法及代碼示例
- Swift AsyncStream min(by:)用法及代碼示例
- Swift AsyncStream map(_:)用法及代碼示例
- Swift AsyncStream max()用法及代碼示例
- Swift AsyncSequence dropFirst(_:)用法及代碼示例
- Swift AsyncSequence reduce(_:_:)用法及代碼示例
- Swift AsyncSequence first(where:)用法及代碼示例
- Swift AsyncSequence prefix(_:)用法及代碼示例
- Swift AsyncSequence map(_:)用法及代碼示例
- Swift AsyncSequence allSatisfy(_:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 AsyncStream。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
