ios - RxSwift 触发可观察执行

标签 ios observable rx-swift subject-observer publishsubject

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

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

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

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

Observable 是否有任何方法可以“刷新”它并向所有当前订阅者传递新值?

最佳答案

如果我正确地解释了这个问题,那么这是 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() 发生后更新。

关于ios - RxSwift 触发可观察执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043435/

相关文章:

ios - Xamarin Forms 上的 UIWebView 弃用和 App Store 拒绝

ios - 如何区分 tableViewCell 中的按钮,在 tableView 中重复使用?

android - 无法查询使用 Realm

java - MetaController 应该观察三个对象

c# - 可观察到 Rx 中的回调

ios - 显示tableView时,如何将tableView单元排列为不同的顺序?

ios - swift UITableView : Datasource assigning Issue

ios - os, objective-c, 我无法准确知道我的应用程序崩溃的那一行

ios - RxSwift - 如何具有可读的 mergeLatest 事件元素变量名称?

swift - 使用 Moya 将参数附加到每个网络调用