【问题标题】:RXSwift combine two observables and call to APIRXSwift 结合两个 observables 并调用 API
【发布时间】:2021-07-30 13:12:49
【问题描述】:

我是 RX 的新手,所以我有点困惑如何正确地做到这一点。

我的视图模型:

let feedItems: BehaviorSubject<[FeedItem]> = BehaviorSubject(value: [FeedItem]())
let isLoadingMore: PublishSubject<Bool> = PublishSubject()
let loadPageTrigger: PublishSubject<Void> = PublishSubject()
let isRefreshing: PublishSubject<Bool> = PublishSubject()

func fetchFeed(showLoading: Bool = false, loadMore: Bool = false) {

  //api call and set self.feedItems.onNext(response) after completion

}

在我的VC中,我将feedItems绑定到collectionView,检查collectionView何时在底部并将其绑定到isLoadingMore,并将UIRefresherControl绑定到isRefreshing。

在我的 ViewModel 中,我想在 loadPageTrigger 中获取 isRefreshing 和 isLoadingMore 的值,并使用一些参数调用 fetchFeed:

视图模型:

override init() {
    super.init()
    loadPageTrigger.subscribe(onNext:  {
        // need to get values of isRefreshing and isLoadingMore to call fetchFeed with params
        self.fetchFeed()
    }).disposed(by: disposeBag)
}

【问题讨论】:

    标签: mvvm rx-swift


    【解决方案1】:

    主题提供了一种探索 Rx 的便捷方式,但不建议将它们用于日常使用。 -- Intro to Rx

    如果您正在加载充满主题的视图模型,那么您还没有完全掌握 Rx。不过没关系,每个人都必须从某个地方开始。

    基于你已有的最直接的解决方案是这样的:

    loadPageTrigger
        .withLatestFrom(Observable.combineLatest(isRefreshing, isLoadingMore))
        .subscribe(onNext: { [unowned self] isRefreshing, isLoadingMore in
            // here you have isRefreshing and isLoadingMore as Bools
            self.fetchFeed()
        })
        .disposed(by: disposeBag)
    

    注意unowned self。确保您没有在 self 中保存的 disposeBag 保留的闭包中捕获 self 非常重要。

    最佳解决方案将只涉及 Observables 而完全不涉及 Subjects。

    IObservable 接口是主要类型,您将接触到用于表示动态数据序列,因此将构成您使用 Rx 的大部分工作的核心关注点... -- Intro to Rx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2019-01-25
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多