Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RxSwift触发可观察执行_Ios_Observable_Rx Swift_Subject Observer_Publishsubject - Fatal编程技术网

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()
,该方法触发网络请求并将结果发布到a
ReplaySubject


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按钮。接收。点击