gpt4 book ai didi

swift - 在看到特定数量的事件后处理下一个事件

转载 作者:行者123 更新时间:2023-11-28 10:54:50 25 4
gpt4 key购买 nike

我正在尝试做的是订阅一个发出一系列 Enums 的可观察对象。目标是每当我看到 3 个特定类型的 Enums 时,我的 onNext 就会被调用。以下是我尝试过的但是,它只能使用一次。它不会继续下去。我想知道处理此问题的最佳方法是什么。

enum Baseball {
case strike, ball, hit
}

let bag = DisposeBag()
let subject = PublishSubject<Baseball>()

subject.filter { $0 == .strike }
.elementAt(2)
.subscribe(onNext: { _ in print("3 Strikes you're out")
}).addDisposableTo(bag)

// First batter
subject.onNext(.strike)
subject.onNext(.ball)
subject.onNext(.ball)
subject.onNext(.ball)
subject.onNext(.strike)
subject.onNext(.strike) // 3 Strikes you're out is printed

// Second batter
subject.onNext(.ball)
subject.onNext(.ball)
subject.onNext(.hit)

// Third batter
subject.onNext(.strike)
subject.onNext(.strike)
subject.onNext(.strike) // Would like this to fire as well

最佳答案

使用缓冲运算符:

subject.filter { $0 == .strike }
.buffer(timeSpan: 3e7, count: 3, scheduler: MainScheduler.instance)
.subscribe(onNext: { print("3 Strikes you're out") })
.addDisposableTo(bag)

现在每次有 3 次罢工时都会发出信号,或者大约每年一次。

如果您不喜欢它每年超时的事实,您可以编写自己的缓冲区运算符,它只需要一个计数:

extension Observable {
func buffer(count: Int) -> Observable<[E]> {
return Observable<[E]>.create { observer in
var elements: [E] = []
let lock = NSRecursiveLock()
return self.subscribe { event in
switch event {
case .completed:
observer.onCompleted()
case .error(let error):
observer.onError(error)
case .next(let element):
lock.lock(); defer { lock.unlock() }
elements.append(element)
if elements.count == count {
observer.onNext(elements)
elements = []
}
}
}
}
}
}

关于swift - 在看到特定数量的事件后处理下一个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44319788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com