Nic*_*gen 5 swift swift-concurrency
在试验 Swift 的并发性时,我希望有一个干净的 API 来公开给定元素类型的异步序列及其节流版本:
var intStream: AsyncStream<Int> {
AsyncStream<Int>(Int.self, bufferingPolicy: .bufferingNewest(5)) { continuation in
Task.detached {
for _ in 0..<100 {
try await Task.sleep(nanoseconds: 1 * 1_000_000_000)
continuation.yield(Int.random(in: 1...10))
}
continuation.finish()
}
}
}
var throttledIntStream: AsyncStream<Int> {
intStream.throttle(for: .seconds(2))
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为节流阀返回其自己的类型:错误:
Cannot convert return expression of type 'AsyncThrottleSequence<AsyncStream<Int>, ContinuousClock, Int>' to return type 'AsyncStream<Int>'
为了获得类型擦除我可以做
var throttledIntStream: some AsyncSequence {
intStream.debounce(for: Duration.seconds(2))
}
Run Code Online (Sandbox Code Playgroud)
但随后我也丢失了我想保留的元素类型信息。
有什么建议如何最好地解决这个问题?
编辑:这指向我想要的解决方案,但我想我需要等待https://forums.swift.org/t/anyasyncsequence/50828/2
使用遇到什么问题
var throttledIntStream: AsyncThrottleSequence<AsyncStream<Int>, ContinuousClock, Int>{
intStream.throttle(for: .seconds(2))
}
Run Code Online (Sandbox Code Playgroud)
你从哪里得到AsyncThrottleSequence?无论如何,您可以使用以下内容扩展 AsyncStream:
extension AsyncStream {
typealias throttled = AsyncThrottleSequence<AsyncStream<Element>, ContinuousClock, Element>
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
var throttledIntStream: AsyncStream<Int>.throttled {
intStream.throttle(for: .seconds(2))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |