【问题标题】:RxSwift trigger observable executionRxSwift 触发可观察执行
【发布时间】:2018-04-26 12:49:08
【问题描述】:

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

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

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

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

Observable 上是否有任何方法可以“刷新”它并为所有当前订阅者提供新价值?

【问题讨论】:

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


    【解决方案1】:

    如果我正确地解释了这个问题,这在 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())
        }
    }
    

    在本例中,您可以多次订阅resultsObservable,每次都应在新的reload() 出现后更新。

    【讨论】:

    • 感谢您的回复。我已经按照您在答案中描述的方式实现了所需的功能。然而,问题是是否可以通过调用 observable 本身的一些方法调用来刷新resultsObservable,而不是服务上的reload() 方法。
    • 在本例中,您可以将Observable 绑定到reloadSubject,而不是调用reload(),例如UIButton.rx.tap
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多