我正在使用UIRefreshControl变量绑定来重新加载数据.
然而,它正在起作用,以下对我来说是错误的:
1)我知道RXCocoa扩展中有一个rx_refreshing变量,但我无法让它在这个上下文中工作.
2)我绑定答案(这是一个变量的数组)两次.一旦我加载视图控制器,当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) } ...
解决方法
首先,它实际上并没有起作用.它似乎正在起作用.在您的代码中,在调用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,我认为变量不是必需的或有用的,至少在这个例子中是这样.你仍然可以使用它.此外,没有必要在两个地方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.