首页 > 解决方案 > 如何在 RxSwift 中检查 ReplaySubject 中的所有历史值?

问题描述

我有一个简单的结构Foo

struct Foo {
    let bar: String
}

现在我创建一个无界ReplaySubjectFoos:

let subject = ReplaySubject<Foo>.createUnbounded()

我现在如何理解(未终止的)流是否Foo具有bar等于abc?(这可能是第 1 个、第 3 个或第 20 个元素。)

标签: rx-swift

解决方案


首先,这是一个疯狂的要求。在使用 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 }
    }
}

推荐阅读