Я пытаюсь создать приложение, которое связывается с сервером 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 ()» только в том случае, если версии ответов совпадают.Не могли бы вы показать мне, как я могу изменить свой код, чтобы он работал?