ios - RxSwift: using rx_refreshing for uirefreshcontrol -


i using uirefreshcontrol + variable binding reload data.

it working, however, following feels wrong me:

1) know there rx_refreshing variable in rxcocoa extension, unable work in context.

2) binding answers (which variable of array) twice. once when load view controller , again when uirefreshcontrol refreshing.

3) parts check whether uirefreshcontrol refreshing or not looks awkward. feels defeats purpose of using reactive?

...  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) }  ... 

so first of all, it's not working. seems working. in code, you're not waiting network request finish before call rc.endrefreshing(). instead, you're making network call , calling endrefreshing().

// `rc.rx_controlevent(.valuechanged)` gets called once, // when user pulls down.  rc.rx_controlevent(.valuechanged)       // user pulled down 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 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) 

to address concern 1, you're right, can use rx_refreshing turn off refreshing instead of endrefreshing().

to address concern 2, don't think variable necessary or useful, @ least in example. still use though. also, it's not necessary loadanswers() in 2 places.

to address concern 3, yea, simplifying lot , using rx bit more.

here's code work, use rx_refreshing, , simplify things lot:

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)  // use `answers` bind data source, etc. 

Comments

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -