min*_*eow 6 ios uirefreshcontrol swift rx-swift
我正在使用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)
}
...
Run Code Online (Sandbox Code Playgroud)
sol*_*ell 13
首先,它实际上并没有起作用.它似乎正在起作用.在您的代码中,您实际上并没有在调用之前等待网络请求完成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)
Run Code Online (Sandbox Code Playgroud)
为了解决问题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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4074 次 |
| 最近记录: |