AsyncStream
— это тип из Swift Concurrency, который предоставляет способ асинхронно генерировать последовательность значений с использованием AsyncSequence
. Он особенно полезен для работы с потоками данных, которые производятся со временем, например, события UI, сетевые запросы или данные с датчиков.
AsyncStream
реализует протокол AsyncSequence
, что позволяет использовать его в for await
циклах.Task
, async/await
и другими инструментами современного асинхронного Swift.Допустим, у нас есть API с колбэками, и мы хотим обернуть его в AsyncStream
:
func buttonClicks() -> AsyncStream<Void> {
AsyncStream { continuation in
let button = UIButton()
button.addAction(
UIAction { _ in continuation.yield(()) },
for: .touchUpInside
)
continuation.onTermination = { _ in button.removeFromSuperview() }
}
}
// Использование
Task {
for await _ in buttonClicks() {
print("Кнопка нажата!")
}
}
continuation
.continuation.yield(_:)
можно отправлять новые значения.continuation.finish()
или при отмене Task
.continuation.onTermination
.AsyncStream
проще для одноразовых задач, а Combine мощнее для сложных реактивных цепочек.AsyncStream
предоставляет более типобезопасный и удобный интерфейс.Если нужно передавать ошибки, используйте AsyncThrowingStream
. Например:
func fetchData() -> AsyncThrowingStream<Data, Error> {
AsyncThrowingStream { continuation in
Task {
do {
let data = try await networkRequest()
continuation.yield(data)
continuation.finish()
} catch {
continuation.finish(throwing: error)
}
}
}
}
AsyncStream
— это мощный инструмент для работы с асинхронными последовательностями в Swift. Он особенно полезен для:
Его главные преимущества — простота использования и естественная интеграция с Swift Concurrency.