rx-swift - 如何在 RxSwift 中检查 ReplaySubject 中的所有历史值?
问题描述
我有一个简单的结构Foo
:
struct Foo {
let bar: String
}
现在我创建一个无界ReplaySubject
的Foo
s:
let subject = ReplaySubject<Foo>.createUnbounded()
我现在如何理解(未终止的)流是否Foo
具有bar
等于abc
?(这可能是第 1 个、第 3 个或第 20 个元素。)
解决方案
首先,这是一个疯狂的要求。在使用 Rx 时,您不应该考虑“过去是什么”。相反,您应该考虑始终存在的情况。你应该考虑不变量...
也就是说,下面的运算符将为您发出索引。由于主体能够不断地发出事件,因此操作员被设计为实时工作。它可以这样使用:
let indexes = subject.indexOfElementSatisfying { $0.bar == "abc" }
这里是:
extension ObservableConvertibleType {
/**
Emits the index of all the values in the stream that satisfy the predicate.
- parameter pred: The predicate that determines whether the value satisfies the condition
- returns: An observable sequence of indexes to those elements.
*/
func indexOfElementSatisfying(_ pred: @escaping (E) throws -> Bool) -> Observable<Int> {
return asObservable()
.enumerated()
.filter { try pred($0.element) }
.map { $0.index }
}
}
推荐阅读
- vb.net - 升级的 VB .Net 项目中的 BC42020 有多严重?
- json - 有没有办法在 GDScript 中定义一个 to_json 处理程序?
- jquery - 如何使用 jquery 将 Ajax 结果正确附加到现有的 ul、li
- angular - 角管中的干燥
- python - 使用 pyqtgraph 进行实时绘图
- facebook - 开发中的 Facebook 应用程序测试用户等待状态超级延迟的邀请通知
- ruby-on-rails - 块后 label_tag 的 ERB 结束标记
- python - Python:如何从优先队列中采样?
- laravel - JS 供应商发布的文件不起作用
- sonarqube - 试图从代码覆盖中排除单元测试