ios – RxSwift:使用rx_refreshing进行uirefreshcontrol

前端之家收集整理的这篇文章主要介绍了ios – RxSwift:使用rx_refreshing进行uirefreshcontrol前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用UIRefreshControl变量绑定来重新加载数据.

然而,它正在起作用,以下对我来说是错误的:

1)我知道RXCocoa扩展中有一个rx_refreshing变量,但我无法让它在这个上下文中工作.

2)我绑定答案(这是一个变量的数组)两次.一旦我加载视图控制器,当UIRefreshControl刷新时再次加载.

3)我检查UIRefreshControl是否令人耳目一新的部分看起来很尴尬.感觉它是否违背了使用反应的目的?

  1. ...
  2.  
  3. let answers: Variable<[Answer]> = Variable([])
  4.  
  5. override func viewDidLoad() {
  6. loadAnswers()
  7. .shareReplay(1)
  8. .bindTo(answers)
  9. .addDisposableTo(self.disposeBag)
  10. setupRx()
  11. }
  12.  
  13. func loadAnswers() -> Observable<[Answer]> {
  14. return Network.rxArrayRequest(Spark.Answers)
  15. }
  16.  
  17. func setupRx() {
  18. rc.rx_controlEvent(.ValueChanged)
  19. .map { _ in !self.rc.refreshing }
  20. .filter { $0 == false }
  21. .flatMapLatest { [unowned self] _ in
  22. return self.loadAnswers()
  23. }
  24. .bindTo(answers)
  25. .addDisposableTo(self.disposeBag)
  26.  
  27. rc.rx_controlEvent(.ValueChanged)
  28. .map { _ in self.rc.refreshing }
  29. .filter { $0 == true }
  30. .subscribeNext { [unowned self] _ in
  31. self.rc.endRefreshing()
  32. }
  33. .addDisposableTo(self.disposeBag)
  34. }
  35.  
  36. ...

解决方法

首先,它实际上并没有起作用.它似乎正在起作用.在您的代码中,在调用rc.endRefreshing()之前,您实际上并没有等待网络请求完成.相反,您只是进行网络调用,然后立即调用endRefreshing().
  1. // `rc.rx_controlEvent(.ValueChanged)` only gets called once,// when the user pulls down.
  2.  
  3. rc.rx_controlEvent(.ValueChanged) // user pulled down to refresh
  4. .map { _ in !self.rc.refreshing } // !true -> false
  5. .filter { $0 == false } // false == false
  6. .flatMapLatest { [unowned self] _ in
  7. return self.loadAnswers() // request answers
  8. }
  9. .bindTo(answers)
  10. .addDisposableTo(self.disposeBag)
  11.  
  12. rc.rx_controlEvent(.ValueChanged) // user pulled down to refresh
  13. .map { _ in self.rc.refreshing } // true -> true
  14. .filter { $0 == true } // true == true
  15. .subscribeNext { [unowned self] _ in
  16. self.rc.endRefreshing() // end refreshing
  17. }
  18. .addDisposableTo(self.disposeBag)

为了解决问题1,你是对的,你可以使用rx_refreshing来关闭刷新而不是endRefreshing().

为了解决问题2,我认为变量不是必需的或有用的,至少在这个例子中是这样.你仍然可以使用它.此外,没有必要在两个地方loadAnswers().

为了解决问题3,是的,你可以简化这一点并使用Rx多一点.

这里的代码实际上可以工作,使用rx_refreshing,并简化了很多事情:

  1. let initial = Observable<Void>.just(())
  2. let refresh = rc.rx_controlEvent(.ValueChanged).map { _ in () }
  3. let answers = Observable.of(initial,refresh)
  4. .merge()
  5. .flatMapLatest{ _ in self.loadAnswers() }
  6. .shareReplayLatestWhileConnected()
  7.  
  8. answers
  9. .map { _ in false }
  10. .bindTo(rc.rx_refreshing)
  11. .addDisposableTo(disposeBag)
  12.  
  13. // also use `answers` to bind to your data source,etc.

猜你在找的iOS相关文章