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
Post a Comment