struct CountdownPublisher: Publisher {
typealias Output = Int
typealias Failure = Never
let count: Int
func receive<S>(subscriber: S) where S : Subscriber, CountdownPublisher.Failure == S.Failure, CountdownPublisher.Output == S.Input {
var currentCount = count
let subscription = TimerSubscription(subscriber: subscriber, currentCount: currentCount)
subscriber.receive(subscription: subscription)
}
}
// 实现自定义的 Subscription 来支持倒计时发布
class TimerSubscription<S: Subscriber>: Subscription where S.Input == Int {
var subscriber: S?
var currentCount: Int
init(subscriber: S, currentCount: Int) {
self.subscriber = subscriber
self.currentCount = currentCount
}
func request(_ demand: Subscribers.Demand) {
// 模拟数据流
while currentCount > 0, demand > 0 {
_ = subscriber?.receive(currentCount)
currentCount -= 1
}
subscriber?.receive(completion: .finished)
}
func cancel() {
subscriber = nil
}
}