如何在RxSwift的ReplaySubject中检查所有历史值?

时间:2019-02-04 09:30:37

标签: rx-swift

我有一个简单的结构Foo

struct Foo {
    let bar: String
}

现在,我创建ReplaySubject的无限制Foo

let subject = ReplaySubject<Foo>.createUnbounded()

我现在如何理解(未终止的)流是否有一个Foo等于bar的{​​{1}}? (这可以是第1个,第3个或第20个元素。)

1 个答案:

答案 0 :(得分:1)

首先,这有点疯狂。使用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 }
    }
}