RxSwift︰ 使用 rx_refreshing uirefreshcontrol

标签: ios Swift
发布时间: 2017/3/6 23:29:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的 UIRefreshControl + Variable 绑定重新加载数据。

然而,它的工作,以下感觉到我错了︰

1) 我知道 rx_refreshing 变量在 RXCocoa 扩展,但我不能让它在这方面的工作。

2) 我绑定的答案 (这是 Variable 的数组) 两次。一旦当我加载视图控制器和再当 UIRefreshControl 是令人耳目一新。

3) 的部分,我在何处检查是否 UIRefreshControl 是令人耳目一新,或不看起来很尴尬。感觉就像它击败使用无功的目的吗?

...

let answers: Variable<[Answer]> = Variable([])

override func viewDidLoad() {       
  loadAnswers()
     .shareReplay(1)
     .bindTo(answers)
     .addDisposableTo(self.disposeBag)
  setupRx()
}

func loadAnswers() -> Observable<[Answer]> {
  return Network.rxArrayRequest(Spark.Answers)
}  

func setupRx() {
  rc.rx_controlEvent(.ValueChanged)
    .map { _ in !self.rc.refreshing }
    .filter { $0 == false }
    .flatMapLatest { [unowned self] _ in
      return self.loadAnswers()
    }
    .bindTo(answers)
    .addDisposableTo(self.disposeBag)

  rc.rx_controlEvent(.ValueChanged)
    .map { _ in self.rc.refreshing }
    .filter { $0 == true }
    .subscribeNext { [unowned self] _ in
      self.rc.endRefreshing()
    }
    .addDisposableTo(self.disposeBag)
}

...

解决方法 1:

首先,它有没有实际工作。 它只是似乎工作。在代码中,你实际上不等待网络请求完成之前你叫 rc.endRefreshing() 。 相反,你只打网络电话,然后立即调用 endRefreshing()

// `rc.rx_controlEvent(.ValueChanged)` only gets called once,
// when the user pulls down.

rc.rx_controlEvent(.ValueChanged)       // user pulled down to refresh
  .map { _ in !self.rc.refreshing }     // !true -> false 
  .filter { $0 == false }               // false == false
  .flatMapLatest { [unowned self] _ in
    return self.loadAnswers()           // request answers
  }
  .bindTo(answers)
  .addDisposableTo(self.disposeBag)

rc.rx_controlEvent(.ValueChanged)       // user pulled down to refresh
  .map { _ in self.rc.refreshing }      // true -> true
  .filter { $0 == true }                // true == true
  .subscribeNext { [unowned self] _ in
    self.rc.endRefreshing()             // end refreshing
  }
  .addDisposableTo(self.disposeBag)

关注的问题 1 ,你说得对,你可以使用 rx_refreshing 来关闭刷新而不 endRefreshing()

关注的问题 2 ,我不认为 Variable 是必要的或有用的至少在这个例子中。 虽然可以仍然使用它。 而且,它是不必要的 loadAnswers() 在两个地方。

关注的问题 3 ,是的你可以简化很多,使用 Rx 更多一点。

下面是代码实际上行得通,使用 rx_refreshing ,和简化的东西很多︰

let initial = Observable<Void>.just(())
let refresh = rc.rx_controlEvent(.ValueChanged).map { _ in () }
let answers = Observable.of(initial, refresh)
    .merge()
    .flatMapLatest{ _ in self.loadAnswers() }
    .shareReplayLatestWhileConnected()

answers
    .map { _ in false }
    .bindTo(rc.rx_refreshing)
    .addDisposableTo(disposeBag)

// also use `answers` to bind to your data source, etc.
赞助商