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)
`
`
`