【发布时间】:2019-06-30 04:59:19
【问题描述】:
我是一名 android 开发人员,但对 Swift/Rxswift 很陌生,我试图为 NetworkBoundResource 编写等效代码,但我不确定是否可以使用 Rxswift 来完成它,因为它缺少与 MediatorLiveData 等效的代码并且合并运算符不允许您为每个可观察对象分配闭包。
有什么线索吗?
【问题讨论】:
标签: android ios swift reactjs rx-swift
我是一名 android 开发人员,但对 Swift/Rxswift 很陌生,我试图为 NetworkBoundResource 编写等效代码,但我不确定是否可以使用 Rxswift 来完成它,因为它缺少与 MediatorLiveData 等效的代码并且合并运算符不允许您为每个可观察对象分配闭包。
有什么线索吗?
【问题讨论】:
标签: android ios swift reactjs rx-swift
这是一个有用的函数工厂。您可以通过传入有关如何从数据库和网络检索数据以及如何将数据保存到数据库的指令来调用它。它会生成一个运算符,您可以在 flatMap 中使用该运算符从请求中获取结果。
它将首先从数据库发出值,然后发出网络请求。如果网络请求成功,算子会发出结果,并将其发送到数据库进行存储。
我会被称为:let getResource = resource(loadFromDb: /* loader */, network: /* requester */, save: /* saver */) 然后你可以在一个 flatMap 中使用 getRequest 而不是 RequestType 的 Observable。
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])
}
}
}
只是一个想法。
【讨论】: