RxSwift筆記 - RxCocoa 基礎 (五) : UITableView + Refresh

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)
    
`
`
`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章