构建自定义AsyncSequence:从传感器流到分页API
深入AsyncIteratorProtocol的实现细节,创建支持取消、缓冲和背压的异步序列,适配硬件事件流或无限滚动分页。 · 难度:入门 · +10XP
构建自定义AsyncSequence:从传感器流到分页API
AsyncSequence协议要求实现makeAsyncIterator并返回一个AsyncIteratorProtocol。本教程通过AsyncStream.Continuation与手动withTaskCancellationHandler两种方式构建:一个模拟蓝牙心率传感器的连续数据流,一个支持游标的分页加载序列。重点讲解yield背压、取消传播以及ThrowingAsyncSequence的错误处理。
struct HeartRateSensor: AsyncSequence {
typealias Element = Int
struct Iterator: AsyncIteratorProtocol {
mutating func next() async throws -> Int? {
try await Task.sleep(nanoseconds: 1_000_000_000)
return Int.random(in: 60...100)
}
}
func makeAsyncIterator() -> Iterator {
Iterator()
}
}