Swift - RxSwift的使用詳解32(UITableView的使用3:刷新表格數(shù)據(jù))

很多情況下罐孝,表格里的數(shù)據(jù)不是一開始就準(zhǔn)備好的、或者固定不變的肥缔×ぃ可能我們需要先向服務(wù)器請求數(shù)據(jù),再將獲取到的內(nèi)容顯示在表格中。
要重新加載表格數(shù)據(jù)改艇,過去的做法就是調(diào)用 tableViewreloadData() 方法收班。本文介紹在使用 RxSwift 的情況下,應(yīng)該如何刷新數(shù)據(jù)谒兄。

三摔桦、數(shù)據(jù)刷新

1,效果圖

(1)界面初始化完畢后承疲,tableView 默認(rèn)會加載一些隨機數(shù)據(jù)邻耕。

(2)點擊右上角的刷新按鈕,tableView 會重新加載并顯示一批新數(shù)據(jù)燕鸽。

(3)為方便演示兄世,每次獲取數(shù)據(jù)不是真的去發(fā)起網(wǎng)絡(luò)請求。而是在本地生成后延遲 2 秒返回绵咱,模擬這種異步請求的情況碘饼。

2,樣例代碼

import UIKit
import RxSwift
import RxCocoa
import RxDataSources
 
class ViewController: UIViewController {
     
    //刷新按鈕
    @IBOutlet weak var refreshButton: UIBarButtonItem!
     
    //表格
    var tableView:UITableView!
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //創(chuàng)建表格視圖
        self.tableView = UITableView(frame: self.view.frame, style:.plain)
        //創(chuàng)建一個重用的單元格
        self.tableView!.register(UITableViewCell.self,
                                 forCellReuseIdentifier: "Cell")
        self.view.addSubview(self.tableView!)
         
        //隨機的表格數(shù)據(jù)
        let randomResult = refreshButton.rx.tap.asObservable()
            .startWith(()) //加這個為了讓一開始就能自動請求一次數(shù)據(jù)
            .flatMapLatest(getRandomResult)
            .share(replay: 1)
         
        //創(chuàng)建數(shù)據(jù)源
        let dataSource = RxTableViewSectionedReloadDataSource
            <SectionModel<String, Int>>(configureCell: {
                (dataSource, tv, indexPath, element) in
                let cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
                cell.textLabel?.text = "條目\(indexPath.row):\(element)"
                return cell
            })
         
        //綁定單元格數(shù)據(jù)
        randomResult
            .bind(to: tableView.rx.items(dataSource: dataSource))
            .disposed(by: disposeBag)
    }
     
    //獲取隨機數(shù)據(jù)
    func getRandomResult() -> Observable<[SectionModel<String, Int>]> {
        print("正在請求數(shù)據(jù)......")
        let items = (0 ..< 5).map {_ in
            Int(arc4random())
        }
        let observable = Observable.just([SectionModel(model: "S", items: items)])
        return observable.delay(2, scheduler: MainScheduler.instance)
    }
}

3悲伶,防止表格多次刷新的說明

(1)flatMapLatest 的作用是當(dāng)在短時間內(nèi)(上一個請求還沒回來)連續(xù)點擊多次“刷新”按鈕艾恼,雖然仍會發(fā)起多次請求,但表格只會接收并顯示最后一次請求麸锉。避免表格出現(xiàn)連續(xù)刷新的現(xiàn)象钠绍。

//隨機的表格數(shù)據(jù)
let randomResult = refreshButton.rx.tap.asObservable()
    .startWith(()) //加這個為了讓一開始就能自動請求一次數(shù)據(jù)
    .flatMapLatest(getRandomResult)
    .share(replay: 1)

(2)我們也對源頭進行限制下。即通過 throttle 設(shè)置個閥值(比如 1 秒)花沉,如果在1秒內(nèi)有多次點擊則只取最后一次柳爽,那么自然也就只發(fā)送一次數(shù)據(jù)請求。

//隨機的表格數(shù)據(jù)
let randomResult = refreshButton.rx.tap.asObservable()
    .throttle(1, scheduler: MainScheduler.instance) //在主線程中操作碱屁,1秒內(nèi)值若多次改變磷脯,取最后一次
    .startWith(()) //加這個為了讓一開始就能自動請求一次數(shù)據(jù)
    .flatMapLatest(getRandomResult)
    .share(replay: 1)

附:停止數(shù)據(jù)請求

? ? ? ? 在實際項目中我們可能會需要對一個未完成的網(wǎng)絡(luò)請求進行中斷操作。比如切換頁面或者分類時娩脾,如果上一次的請求還未完成就要將其取消掉赵誓。下面通過樣例演示如何實現(xiàn)該功能。

1柿赊,效果圖

? ? ? ?這里我們在前面樣例的基礎(chǔ)上增加了個“停止”按鈕俩功。當(dāng)發(fā)起請求且數(shù)據(jù)還未返回時(2 秒內(nèi)),按下該按鈕后便會停止對結(jié)果的接收處理碰声,即表格不加載顯示這次的請求數(shù)據(jù)诡蜓。

2,樣例代碼

? ? ? ?該功能簡單說就是通過 takeUntil 操作符實現(xiàn)胰挑。當(dāng) takeUntil 中的 Observable 發(fā)送一個值時蔓罚,便會結(jié)束對應(yīng)的 Observable椿肩。

import UIKit
import RxSwift
import RxCocoa
import RxDataSources
 
class ViewController: UIViewController {
     
    //刷新按鈕
    @IBOutlet weak var refreshButton: UIBarButtonItem!
     
    //停止按鈕
    @IBOutlet weak var cancelButton: UIBarButtonItem!
     
    //表格
    var tableView:UITableView!
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //創(chuàng)建表格視圖
        self.tableView = UITableView(frame: self.view.frame, style:.plain)
        //創(chuàng)建一個重用的單元格
        self.tableView!.register(UITableViewCell.self,
                                 forCellReuseIdentifier: "Cell")
        self.view.addSubview(self.tableView!)
         
        //隨機的表格數(shù)據(jù)
        let randomResult = refreshButton.rx.tap.asObservable()
            .startWith(()) //加這個為了讓一開始就能自動請求一次數(shù)據(jù)
            .flatMapLatest{
                self.getRandomResult().takeUntil(self.cancelButton.rx.tap)
            }
            .share(replay: 1)
         
        //創(chuàng)建數(shù)據(jù)源
        let dataSource = RxTableViewSectionedReloadDataSource
            <SectionModel<String, Int>>(configureCell: {
                (dataSource, tv, indexPath, element) in
                let cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
                cell.textLabel?.text = "條目\(indexPath.row):\(element)"
                return cell
            })
         
        //綁定單元格數(shù)據(jù)
        randomResult
            .bind(to: tableView.rx.items(dataSource: dataSource))
            .disposed(by: disposeBag)
    }
     
    //獲取隨機數(shù)據(jù)
    func getRandomResult() -> Observable<[SectionModel<String, Int>]> {
        print("正在請求數(shù)據(jù)......")
        let items = (0 ..< 5).map {_ in
            Int(arc4random())
        }
        let observable = Observable.just([SectionModel(model: "S", items: items)])
        return observable.delay(2, scheduler: MainScheduler.instance)
    }
}

RxSwift使用詳解系列
原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豺谈,隨后出現(xiàn)的幾起案子覆旱,更是在濱河造成了極大的恐慌,老刑警劉巖核无,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣唱,死亡現(xiàn)場離奇詭異,居然都是意外死亡团南,警方通過查閱死者的電腦和手機噪沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吐根,“玉大人正歼,你說我怎么就攤上這事】介伲” “怎么了局义?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冗疮。 經(jīng)常有香客問我萄唇,道長,這世上最難降的妖魔是什么术幔? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任另萤,我火速辦了婚禮,結(jié)果婚禮上诅挑,老公的妹妹穿的比我還像新娘四敞。我一直安慰自己,他們只是感情好拔妥,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布忿危。 她就那樣靜靜地躺著,像睡著了一般没龙。 火紅的嫁衣襯著肌膚如雪铺厨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天兜畸,我揣著相機與錄音努释,去河邊找鬼碘梢。 笑死咬摇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煞躬。 我是一名探鬼主播肛鹏,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逸邦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了在扰?” 一聲冷哼從身側(cè)響起缕减,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芒珠,沒想到半個月后桥狡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡皱卓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年裹芝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜汁。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫂易,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掐禁,到底是詐尸還是另有隱情怜械,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布傅事,位于F島的核電站缕允,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹭越。R本人自食惡果不足惜灼芭,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望般又。 院中可真熱鬧彼绷,春花似錦、人聲如沸茴迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堕义。三九已至猜旬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倦卖,已是汗流浹背洒擦。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怕膛,地道東北人熟嫩。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像褐捻,于是被迫代替她去往敵國和親掸茅。 傳聞我的和親對象是個殘疾皇子椅邓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 本文接著在前文樣例的基礎(chǔ)上做個功能改進,增加個實時搜索功能(本地數(shù)據(jù)篩選)昧狮。 四景馁、數(shù)據(jù)搜索過濾 1,...
    八級大狂風(fēng)AM閱讀 4,296評論 1 2
  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,795評論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫逗鸣、插件合住、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • “媽媽,我需要你的愛” 今天在家里玩耍撒璧,兒子用拳頭擊中我的腰部聊疲,力道確實不小。我疼痛感來的同時靈光乍現(xiàn):我要嚇唬一...
    周京京閱讀 428評論 3 2
  • 曾經(jīng)以為7會是收筆之作沪悲,忽略了商業(yè)的重要性获洲,那一步感情牌打出后,還要繼續(xù)賺錢殿如。 依舊的大場面贡珊,依舊的家人主題,太多...
    慢半拍的小蝸牛閱讀 207評論 0 0