In Swift, you can convert Combine publishers to asynchronous sequences using the `AsyncStream` or `AsyncThrowingStream`. This is especially useful when you want to integrate Combine's reactive programming capabilities with Swift's structured concurrency.
import Combine
import Foundation
// Sample Combine publisher
let publisher = Just("Hello, AsyncSequence!")
.eraseToAnyPublisher()
// Convert Combine publisher to AsyncSequence
func asyncSequenceFromPublisher(_ publisher: AnyPublisher) -> AsyncThrowingStream {
AsyncThrowingStream { continuation in
let cancellable = publisher.sink(
receiveCompletion: { completion in
switch completion {
case .finished:
continuation.finish()
case .failure(let error):
continuation.finish(throwing: error)
}
},
receiveValue: { value in
continuation.yield(value)
})
// Store the cancellable if needed
continuation.onTermination = { _ in
cancellable.cancel()
}
}
}
// Usage
Task {
let asyncSequence = asyncSequenceFromPublisher(publisher)
for try await value in asyncSequence {
print(value) // Output: Hello, AsyncSequence!
}
}
How do I avoid rehashing overhead with std::set in multithreaded code?
How do I find elements with custom comparators with std::set for embedded targets?
How do I erase elements while iterating with std::set for embedded targets?
How do I provide stable iteration order with std::unordered_map for large datasets?
How do I reserve capacity ahead of time with std::unordered_map for large datasets?
How do I erase elements while iterating with std::unordered_map in multithreaded code?
How do I provide stable iteration order with std::map for embedded targets?
How do I provide stable iteration order with std::map in multithreaded code?
How do I avoid rehashing overhead with std::map in performance-sensitive code?
How do I merge two containers efficiently with std::map for embedded targets?