RxSwift中的NetworkBoundResource

时间:2019-02-06 09:27:43

标签: android ios swift reactjs rx-swift

我是一名Android开发人员,但对Swift/Rxswift还是陌生的,我试图为NetworkBoundResource编写等效的代码,但是我不确定是否可以使用Rxswift它缺少MediatorLiveData的等效项,并且merge运算符不允许您为每个可观察对象分配一个闭包。

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

这是一个有用的函数工厂。通过传递有关如何从数据库和网络检索数据以及如何将数据保存到数据库的说明来调用它。它会生成一个运算符,您可以在flatMap中使用该运算符来从请求中获取结果。

它将首先从数据库发出值,然后发出网络请求。如果网络请求成功,则操作员将发出结果并将其发送到DB进行存储。

我将被称为:let getResource = resource(loadFromDb: /* loader */, network: /* requester */, save: /* saver */)然后您可以在FlatMap的Observable的RequestType上使用getRequest

func resource<RequestType, ResultType>(loadFromDb: @escaping (RequestType) -> Observable<ResultType>,
                                       network: @escaping (RequestType) -> Observable<ResultType>,
                                       save: AnyObserver<(RequestType, ResultType)>
    ) -> (RequestType) -> Observable<ResultType> {
    return { request in
        return Observable.create { observer in
            let netResult = network(request)
                .share(replay: 1)

            let dispose1 = Observable.concat(loadFromDb(request), netResult)
                .bind(to: observer)

            let dispose2 = netResult
                .map { (request, $0) }
                .bind(to: save)

            return Disposables.create([dispose1, dispose2])
        }
    }
}

只是一个想法。