AsyncThrowingStream conforms to AsyncSequence, providing a convenient way to create an asynchronous sequence without manually implementing an asynchronous iterator. In particular, an asynchronous stream is well-suited to adapt callback- or delegation-based APIs to participate with async-await.
In contrast to AsyncStream, this type can throw an error from the awaited next(), which terminates the stream with the thrown error.
You initialize an AsyncThrowingStream with a closure that receives an AsyncThrowingStream.Continuation. Produce elements in this closure, then provide them to the stream by calling the continuation’s yield(_:) method. When there are no further elements to produce, call the continuation’s finish() method. This causes the sequence iterator to produce a nil, which terminates the sequence. If an error occurs, call the continuation’s finish(throwing:) method, which causes the iterator’s next() method to throw the error to the awaiting call point. The continuation is Sendable, which permits calling it from concurrent contexts external to the iteration of the AsyncThrowingStream.
An arbitrary source of elements can produce elements faster than they are consumed by a caller iterating over them.
要素いくつかからなるある随意のソースは、要素それらを、それらのすべてにわたって反復している呼び出し側によってそれらが消費されるよりも速く生み出すことがありえます。
Because of this, AsyncThrowingStream defines a buffering behavior, allowing the stream to buffer a specific number of oldest or newest elements. By default, the buffer limit is Int.max, which means it’s unbounded.
Adapting Existing Code to Use Streams
既存のコードを適応させてストリームを使うようにする
To adapt existing callback code to use async-await, use the callbacks to provide values to the stream, by using the continuation’s yield(_:) method.
既存のコールバックコードをasync-awaitを使うように適応させるには、コールバックそれらを使って値それらをストリームへと、継続のもつyield(_:)メソッドを使うことによって提供してください。
Consider a hypothetical QuakeMonitor type that provides callers with Quake instances every time it detects an earthquake. To receive callbacks, callers set a custom closure as the value of the monitor’s quakeHandler property, which the monitor calls back as necessary.
ある仮定的なQuakeMonitor型を考えてください、それは呼び出し側それらにQuakeインスタンスそれらを、それがある地震を検出するたびごとに提供します。コールバックそれらを受け取るには、呼び出し側それらはあるあつらえのクロージャをモニタのもつquakeHandlerプロパティの値として設定します、それはモニタが必要に応じて折り返し呼び出しするものです。
Callers can also set an errorHandler to receive asychronous error notifications, such as the monitor service suddenly becoming unavailable.
To adapt this to use async-await, extend the QuakeMonitor to add a quakes property, of type AsyncThrowingStream<Quake>. In the getter for this property, return an AsyncThrowingStream, whose build closure – called at runtime to create the stream – uses the continuation to perform the following steps:
Creates a QuakeMonitor instance.
あるQuakeMonitorインスタンスを作成します。
Sets the monitor’s quakeHandler property to a closure that receives each Quake instance and forwards it to the stream by calling the continuation’s yield(_:) method.
モニタのもつquakeHandlerプロパティをあるクロージャへと設定します、それは各Quakeインスタンスを受け取って、そしてそれをストリームへと、継続のもつyield(_:)メソッドを呼び出すことによって転送します。
Sets the monitor’s errorHandler property to a closure that receives any error from the monitor and forwards it to the stream by calling the continuation’s finish(throwing:) method. This causes the stream’s iterator to throw the error and terminate the stream.
Sets the continuation’s onTermination property to a closure that calls stopMonitoring() on the monitor.
継続のもつonTerminationプロパティをあるクロージャへと設定します、それはstopMonitoring()をモニタ上で呼び出します。
Calls startMonitoring on the QuakeMonitor.startMonitoringをQuakeMonitor上で呼び出します。
extension QuakeMonitor {
}
Because the stream is an AsyncSequence, the call point uses the for-await-in syntax to process each Quake instance as produced by the stream:
Returns a Boolean value that indicates whether the asynchronous sequence contains an element that satisfies the given predicate.
あるブール値を返します、それは非同期シーケンスがこの与えられた述部を満足させる要素を含むかどうかを指し示します。
Returns a Boolean value that indicates whether all elements produced by the asynchronous sequence satisfies the given predicate.
あるブール値を返します、それは非同期シーケンスによって生み出される全ての要素がこの与えられた述部を満足させるかどうかを指し示します。
Returns the minimum element in the asynchronous sequence, using the given predicate as the comparison between elements.
非同期シーケンスの中の最小の要素を返します、与えられた述部を要素間の比較として使います。
Returns the maximum element in the asynchronous sequence, using the given predicate as the comparison between elements.
非同期シーケンスの中の最大の要素を返します、与えられた述部を要素間の比較として使います。
Returns an asynchronous sequence, up to the specified maximum length, containing the initial elements of the base asynchronous sequence.
指定された最大長まで、その基底非同期シーケンスの冒頭の要素を含んでいる、ある非同期シーケンスを返します。
Returns an asynchronous sequence, containing the initial, consecutive elements of the base sequence that satisfy the given predicate.
ある非同期シーケンスを返します、基底シーケンスの冒頭の、連続する要素いくつかを含んでいます、それらは与えられた述部を満たすものです。
Omits a specified number of elements from the base asynchronous sequence, then passes through all remaining elements.
指定された数の要素を基底非同期シーケンスから除きます、それから全ての残りの要素をずっと渡します。
Omits elements from the base asynchronous sequence until a given closure returns false, after which it passes through all remaining elements.
要素を基底非同期シーケンスから、ある与えられたクロージャがfalseを返すまで省きます、それの後それは全ての残りの要素をずっと渡します。
Creates an asynchronous sequence that contains, in order, the elements of the base sequence that satisfy the given predicate.
ある非同期シーケンスを作成します、それは基底シーケンスの要素それらを、順番に含みます、それらは与えられた述部を満たすものです。
Creates an asynchronous sequence that maps the given closure over the asynchronous sequence’s elements.
ある非同期シーケンスを作成します、それは与えられたクロージャを非同期シーケンスのもつ要素のすべてにわたってマップします。
Creates an asynchronous sequence that maps the given error-throwing closure over the asynchronous sequence’s elements.
ある非同期シーケンスを作成します、それは与えられたエラースロークロージャを非同期シーケンスのもつ要素のすべてにわたってマップします。
Creates an asynchronous sequence that maps the given closure over the asynchronous sequence’s elements, omitting results that don’t return a value.
ある非同期シーケンスを作成します、それは与えられたクロージャを非同期シーケンスのもつ要素のすべてにわたってマップします、値を返さない結果を省きます。
Creates an asynchronous sequence that maps an error-throwing closure over the base sequence’s elements, omitting results that don’t return a value.
ある非同期シーケンスを作成します、それはあるエラースロークロージャを基底シーケンスのもつ要素のすべてにわたってマップします、値を返さない結果を省きます。
Creates an asynchronous sequence that concatenates the results of calling the given transformation with each element of this sequence.
ある非同期シーケンスを作成します、それは与えられた変換をこのシーケンスの各要素で呼び出すことの結果を連結します。
Creates an asynchronous sequence that concatenates the results of calling the given error-throwing transformation with each element of this sequence.
ある非同期シーケンスを作成します、それは与えられたエラースロー変換をこのシーケンスの各要素で呼び出すことの結果を連結します。
Returns the result of combining the elements of the asynchronous sequence using the given closure, given a mutable initial value.
非同期シーケンスの要素をこの与えられたクロージャを使って結合する結果を返します、ある可変の初期値を与えられます。
An asynchronous sequence generated from a closure that calls a continuation to produce new elements.
ある非同期シーケンス、それは新しい要素それらを生み出すためにある継続を呼び出すものであるあるクロージャから生成されます。