我有一个Subject
observable,表示需要传递给多个订阅者的网络请求的结果。
我可以使用ReplaySubject
缓冲区1和publish()
方法。但是,网络请求只执行一次。
我想在将来的任何一个点上触发fetch事件。如何触发新的请求?
目前,我有一个Service
对象,其中包含ReplaySubject
并且有一个方法reload()
,它触发网络请求并将结果发布到ReplaySubject
。< / p>
Observable
上是否有任何方法可以刷新&#34;它并为所有当前用户提供新价值?
答案 0 :(得分:0)
如果我正确地解释了这个问题,这在RxSwift中是一个相当普遍的问题。您需要能够在每次“触发”提取时重新创建网络请求Observable
,但是您需要在单个Observable
上提供这些结果,这些结果仅创建一次,并且具有多个订阅者。这是通过flatMap
:
struct Service {
var resultsObservable: Observable<Results> {
return resultsSubject.asObservable()
}
private let resultsSubject: ReplaySubject<Results> = .create(bufferSize: 1)
private let reloadSubject = PublishSubject<Void>()
private let disposeBag = DisposeBag()
init() {
bindFetch()
}
func reload() {
reloadSubject.onNext(())
}
private func bindFetch() {
reloadSubject
.asObservable()
.flatMap(fetch)
.bind(to: resultsSubject)
.disposed(by: disposeBag)
}
private func fetch() -> Observable<Results> {
// URLSession just one example
let urlRequest = URLRequest(url: URL(string: "https://apple.com")!)
return URLSession
.shared
.rx
.data(request: urlRequest)
.map(Results.init)
.catchErrorJustReturn(Results.empty())
}
}
在此示例中,您可以多次订阅resultsObservable
,并且应在新reload()
发生后更新每个{。}}。