Результат фильтра RxSwift для комбината - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать приложение, которое связывается с сервером API через 3 метода.Для простоты назовем их A, B, C.Ответ содержит версию содержащихся данных, например, метод B.Метод C не является версионным, но содержит два числа версий ответа A и B, с которыми совместим с witch.Теперь кешируются новейшие ответы методов A и B.Теперь я хотел бы создать наблюдаемый, который периодически запрашивает данные на языке Си, и если новые версии доступны также для методов А и В.Он должен объединять все три новейших результата, а когда все три метода совместимы, он должен генерировать результаты.

Пока у меня есть что-то вроде этого:

private lazy var methodA: Observable<A> = {
        return Observable.of(
            cachedResultA,
            requestAFromServer)
            .concat()
            .take(1)
    }()



private lazy var methodB: Observable<B> = {
        return Observable.of(
            cachedResultB,
            requestBFromServer)
            .concat()
            .take(1)
    }()

А теперь, как я комбинирую это с методом C

 private lazy var mainLoop: Observable<[Items]> = {
        return Observable<Int>.interval(5.0, scheduler: ConcurrentDispatchQueueScheduler(qos: .background))
            .flatMap{
                _ in

                return self.requestCFromServer()
                    .debug()
                    .withLatesFrom(other1: self.methodA, other2: self.methodB, selector: {
                        cData, aData, bData in
                        return self.computeItems(cData: cData, aData: aData, bData: bData)
                    })
            }
    }().share()

Чтобы объединить все это, я использовал это расширение дляobservable

extension Observable{
    func withLatesFrom<T, U, R>(other1: Observable<T>, other2: Observable<U>, selector: @escaping (E, T, U) -> R) -> Observable<R> {
        return self.withLatestFrom(Observable<Any>.combineLatest(
            other1,
            other2
        )) { x, y in selector(x, y.0, y.1) }
    }
}

Хорошо, все работает нормально, когда метод A и B не меняются.Иногда methodA и methodB возвращают данные, несовместимые с методом C, и тогда self.computeItems () не работает должным образом.Я хотел бы добавить какую-то фильтрацию на основе всех трех результатов и вызывать «self.computeItems ()» только в том случае, если версии ответов совпадают.Не могли бы вы показать мне, как я могу изменить свой код, чтобы он работал?

...