使用 RxSwift 只执行一次 API 调用

Posted

技术标签:

【中文标题】使用 RxSwift 只执行一次 API 调用【英文标题】:API call executed only one time using RxSwift 【发布时间】:2017-03-06 11:15:21 【问题描述】:

我有这个代码似乎是正确的。但它只对第一次搜索更改做出反应。所以代码只执行一次。我尝试将concat(Observable.never()) 添加到我的 getAl 函数中,但它仍然只运行一次。我错过了什么 ?

exists = search.asObservable()
.throttle(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest  searchString -> Observable<Bool> in
    guard !searchString.isEmpty else 
        return Observable.empty()
    
    return ServiceProvider.food.getAll(whereFoodName: searchString)
        .flatMap( (result) -> Observable<Bool> in
            return Observable.just(result.count > 0)
        )

【问题讨论】:

search 是什么? @ULazdins 变量 【参考方案1】:

您的代码只返回一个Observable。要使用它,您应该观察它(或者更确切地说是在 Rx 术语中subscribe

你可能会想要这样的东西:

search.asObservable()
.throttle(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe(onNext:  searchString in 
  let exists = ServiceProvider.food.getAll(whereFoodName: searchString).count > 0
  print("Exists: \(exists)")
  // Or do whatever you want with `exists` constant
  // You could call a method to update UI
  if exists 
    self.button.enabled = true
  
)
.disposed(by: disposeBag) //disposeBag should be your property which will be deallocated on deinit

【讨论】:

以上是关于使用 RxSwift 只执行一次 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 系列

如何使用 RxSwift 和 Alamofire 使用分页?

RxSwift:使用 rx_refreshing 进行 uirefreshcontrol

RXSwift的一些基本交互(OC,Swift,RXSwift对比)

如果全部都不为空,则组合文本字段结果 RxSwift

根据条件去抖 rx 可观察 - RxSwift