Ios RxSwift触发可观察执行
我有一个Ios RxSwift触发可观察执行,ios,observable,rx-swift,subject-observer,publishsubject,Ios,Observable,Rx Swift,Subject Observer,Publishsubject,我有一个主题可观察,表示需要交付给多个订阅者的网络请求的结果 我可以使用缓冲区1的ReplaySubject和publish()方法。但是,网络请求只执行一次 我希望在将来的任何给定点触发fetch事件。如何触发新请求 目前,我有一个Service对象,它保存ReplaySubject,并有一个方法reload(),该方法触发网络请求并将结果发布到aReplaySubject 在Observable上是否有任何方法可以“刷新”它并向所有当前订户提供新的价值?如果我正确解释了这个问题,这是RxSw
主题
可观察,表示需要交付给多个订阅者的网络请求的结果
我可以使用缓冲区1的ReplaySubject
和publish()
方法。但是,网络请求只执行一次
我希望在将来的任何给定点触发fetch事件。如何触发新请求
目前,我有一个Service
对象,它保存ReplaySubject
,并有一个方法reload()
,该方法触发网络请求并将结果发布到aReplaySubject
在
Observable
上是否有任何方法可以“刷新”它并向所有当前订户提供新的价值?如果我正确解释了这个问题,这是RxSwift中相当常见的问题。每次“触发”提取时,您都需要能够重新创建网络请求Observable
,但您需要在一个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())
}
}
struct服务{
var结果可观察:可观察{
返回resultsubject.asObservable()
}
private let resultsubject:ReplaySubject=.create(缓冲区大小:1)
private let reloadSubject=PublishSubject()
私有出租dispebag=dispebag()
init(){
bindFetch()
}
func reload(){
重载subject.onNext(())
}
私有func bindFetch(){
重新加载主题
.asObservable()
.flatMap(获取)
.bind(到:resultsubject)
.处置(由:处置人)
}
private func fetch()->可观察{
//URLSession只是一个例子
让urlRequest=urlRequest(url:url(字符串):https://apple.com")!)
返回URL会话
.共享
.rx
.data(请求:urlRequest)
.map(Results.init)
.catchErrorJustReturn(Results.empty())
}
}
在本例中,您可以多次订阅
resultsObservable
,每次都应该在新的reload()
发生后更新。感谢您的回复。我已经按照您在回答中描述的方式实现了所需的功能。但是,问题是是否可以通过调用可观察对象本身的某个方法调用而不是服务上的reload()
方法来刷新resultsObservable
。在本例中,您可以将可观察对象绑定到reloadSubject
,而不是调用reload()
,ui按钮。接收。点击