RxSwift触发可观察的执行

时间:2018-04-26 12:49:09

标签: ios observable rx-swift subject-observer publishsubject

我有一个Subject observable,表示需要传递给多个订阅者的网络请求的结果。

我可以使用ReplaySubject缓冲区1和publish()方法。但是,网络请求只执行一次。

我想在将来的任何一个点上触发fetch事件。如何触发新的请求?

目前,我有一个Service对象,其中包含ReplaySubject并且有一个方法reload(),它触发网络请求并将结果发布到ReplaySubject。< / p>

Observable上是否有任何方法可以刷新&#34;它并为所有当前用户提供新价值?

1 个答案:

答案 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()发生后更新每个{。}}。