TableView 通常要和 Refresh功能結合使用, Refresh 大都從網絡獲取數據然後進行刷新
本文模擬數據請求和表格刷新
數據獲取, 返回列表數據
/// 獲取數據
func getRandomResult() -> Observable<[SectionModel<String, Int>]> {
let items = (0..<5).map { _ in Int(arc4random()) }
let observable = Observable.just([SectionModel(model: "S", items: items)])
return observable.delay(2, scheduler: MainScheduler.instance) // 模擬網絡請求 延遲2秒鐘
}
創建表格並綁定數據
/// 設置導航欄右側按鈕爲刷新
let refreshButton = UIBarButtonItem()
refreshButton.title = "刷新"
self.navigationItem.rightBarButtonItem = refreshButton
// 創建表格
tableView = UITableView(frame: view.bounds, style: .plain)
// 註冊單元格
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellID")
view.addSubview(tableView)
// 初始化數據
let randomResult = refreshButton.rx.tap.asObservable()
.throttle(1, scheduler: MainScheduler.instance) // 在主線程中操作, 若1秒鐘多次改變, 取最後一次
.startWith(()) // 加這個是爲了一開始就能自動請求一次數據
.flatMapLatest(getRandomResult) // 連續請求時只取最後一次數據
.share(replay: 1)
// 創建數據源
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Int>>( configureCell: {
(dataSource, tableView, indexPath, element) -> UITableViewCell in
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID")!
cell.textLabel?.text = "條目\(indexPath.row): \(element)"
return cell
})
// 數據綁定
randomResult.bind(to: tableView.rx.items(dataSource: dataSource)).disposed(by: disposeBag)
停止數據請求
使用 takeUntil
來停止數據請求
let cancelButton = UIBarButtonItem()
cancelButton.title = "取消"
self.navigationItem.leftBarButtonItem = cancelButton
`
`
`
// 初始化數據
let randomResult = refreshButton.rx.tap.asObservable()
.throttle(1, scheduler: MainScheduler.instance) // 在主線程中操作, 若1秒鐘多次改變, 取最後一次
.startWith(()) // 加這個是爲了一開始就能自動請求一次數據
.flatMapLatest({
// 核心代碼
self.getRandomResult().takeUntil(self.cancelButton.rx.tap) }) // 停止數據請求
.share(replay: 1)
`
`
`