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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。