Как я могу проверить все исторические значения в ReplaySubject в RxSwift? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть простая структура Foo:

struct Foo {
    let bar: String
}

Теперь я создаю неограниченный ReplaySubject из Foo s:

let subject = ReplaySubject<Foo>.createUnbounded()

Как теперь понять,(неопределенный) поток имеет Foo, чей bar был равен abc?(Это может быть 1-й, 3-й или 20-й элемент.)

1 Ответ

0 голосов
/ 04 февраля 2019

Во-первых, это своего рода сумасшедший запрос.Вы не должны думать о том, что было, работая с 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 }
    }
}
...