我正在尝试创建通过3种方法与服务器api通信的应用程序。为了简单起见,我们称它们为A,B,C。响应包含所包含数据的版本,例如B方法。 C方法本身未进行版本控制,但包含两个与Witch兼容的A和B响应版本。现在,将缓存A和B方法的最新响应。现在,我想创建一个可观察的函数,该函数可查询地要求C数据,以及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()
为了结合起来,我将这个扩展名用于可观察的
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()”。 您能告诉我如何修改代码以使其正常工作吗?