CombineLatest的RxSwift过滤器结果

时间:2019-04-15 19:09:40

标签: ios rx-swift

我正在尝试创建通过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()”。 您能告诉我如何修改代码以使其正常工作吗?

0 个答案:

没有答案