Swift - RxSwift的使用詳解2(響應(yīng)式編程與傳統(tǒng)式編程的比較樣例)

在詳細(xì)介紹 RxSwift 相關(guān)的知識(shí)點(diǎn)之前号显,我想先通過一個(gè)樣例演示下 RxSwift 到底能做什么揽碘,好讓大家能夠?qū)ζ溆幸粋€(gè)直觀的了解。

三涌穆、兩種編程方式的比較樣例

1原叮,效果圖

這里我以最常見的 tableView 數(shù)據(jù)展示功能為例作為演示搬味。后面分別使用傳統(tǒng)寫法,以及使用 RxSwift 響應(yīng)式寫法來實(shí)現(xiàn)预烙,大家可以比較下它們的區(qū)別狸剃。

  • ? ? 表格中顯示的是歌曲信息(歌名,以及歌手)
  • ? ? 點(diǎn)擊選中任意一個(gè)單元格绩鸣,在控制臺(tái)中打印出對(duì)應(yīng)的歌曲信息。

2,準(zhǔn)備工作

首先我們創(chuàng)建一個(gè) Music 的結(jié)構(gòu)體竞穷,用來保存歌曲名稱鼠哥、歌手名字。此外它還遵循 CustomStringConvertible 協(xié)議,方便我們輸出調(diào)試同衣。

import UIKit
 
//歌曲結(jié)構(gòu)體
struct Music {
    let name: String //歌名
    let singer: String //演唱者
     
    init(name: String, singer: String) {
        self.name = name
        self.singer = singer
    }
}
 
//實(shí)現(xiàn) CustomStringConvertible 協(xié)議,方便輸出調(diào)試
extension Music: CustomStringConvertible {
    var description: String {
        return "name:\(name) singer:\(singer)"
    }
}

3,過去我們會(huì)這么做(傳統(tǒng)式編程)

(1)首先寫一個(gè) ViewModel

  • 這里面沒有什么太復(fù)雜的東西贪染,就是生成一個(gè) UITableView 所使用的數(shù)據(jù)源。
import Foundation
 
//歌曲列表數(shù)據(jù)源
struct MusicListViewModel {
    let data = [
        Music(name: "無條件", singer: "陳奕迅"),
        Music(name: "你曾是少年", singer: "S.H.E"),
        Music(name: "從前的我", singer: "陳潔儀"),
        Music(name: "在木星", singer: "樸樹"),
    ]
}

(2)視圖控制器代碼(ViewController.swift)

  • 接著我們?cè)O(shè)置 UITableView 的委托催享,并讓視圖控制器實(shí)現(xiàn) UITableViewDataSourceUITableViewDelegate 協(xié)議杭隙,及相關(guān)的協(xié)議方法。
  • 這個(gè)大家肯定都寫過無數(shù)遍了因妙,也沒什么好講的痰憎。算一下,這里一共需要 43 行代碼攀涵。
import UIKit
import RxSwift
 
class ViewController: UIViewController {
 
    //tableView對(duì)象
    @IBOutlet weak var tableView: UITableView!
     
    //歌曲列表數(shù)據(jù)源
    let musicListViewModel = MusicListViewModel()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //設(shè)置代理
        tableView.dataSource = self
        tableView.delegate = self
    }
}
 
extension ViewController: UITableViewDataSource {
    //返回單元格數(shù)量
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return musicListViewModel.data.count
    }
     
    //返回對(duì)應(yīng)的單元格
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
        -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "musicCell")!
        let music = musicListViewModel.data[indexPath.row]
        cell.textLabel?.text = music.name
        cell.detailTextLabel?.text = music.singer
        return cell
    }
}
 
extension ViewController: UITableViewDelegate {
    //單元格點(diǎn)擊
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("你選中的歌曲信息【\(musicListViewModel.data[indexPath.row])】")
    }
}

4画株,現(xiàn)在使用 RxSwift 進(jìn)行改造(響應(yīng)式編程)

(1)對(duì) ViewModel 做些修改

  • 這里我們將 data 屬性變成一個(gè)可觀察序列對(duì)象(Observable Squence)煞赢,而對(duì)象當(dāng)中的內(nèi)容和我們之前在數(shù)組當(dāng)中所包含的內(nèi)容是完全一樣的丈莺。
  • 關(guān)于可觀察序列對(duì)象在后面的文章中我會(huì)詳細(xì)介紹疼电。簡單說就是“序列”可以對(duì)這些數(shù)值進(jìn)行“訂閱(Subscribe)”,有點(diǎn)類似于“通知(NotificationCenter)
import RxSwift
 
//歌曲列表數(shù)據(jù)源
struct MusicListViewModel {
    let data = Observable.just([
        Music(name: "無條件", singer: "陳奕迅"),
        Music(name: "你曾是少年", singer: "S.H.E"),
        Music(name: "從前的我", singer: "陳潔儀"),
        Music(name: "在木星", singer: "樸樹"),
    ])
}

(2)視圖控制器代碼(ViewController.swift)

  • 這里我們不再需要實(shí)現(xiàn)數(shù)據(jù)源和委托協(xié)議了据德。而是寫一些響應(yīng)式代碼鳄乏,讓它們將數(shù)據(jù)和 UITableView 建立綁定關(guān)系跷车。
  • 算了下這里我們只需要 31 行代碼,同之前的相比橱野,一下減少了 1/4 代碼量朽缴。而且代碼也更清爽了些。

代碼的簡單說明:

  • DisposeBag:作用是 Rx 在視圖控制器或者其持有者將要銷毀的時(shí)候水援,自動(dòng)釋法掉綁定在它上面的資源密强。它是通過類似“訂閱處置機(jī)制”方式實(shí)現(xiàn)(類似于 NotificationCenterremoveObserver)。
  • rx.items(cellIdentifier:):這是 Rx 基于 cellForRowAt 數(shù)據(jù)源方法的一個(gè)封裝蜗元。傳統(tǒng)方式中我們還要有個(gè) numberOfRowsInSection 方法或渤,使用 Rx 后就不再需要了(Rx 已經(jīng)幫我們完成了相關(guān)工作)。
  • rx.modelSelected: 這是 Rx 基于 UITableView委托回調(diào)方法 didSelectRowAt 的一個(gè)封裝奕扣。
import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
 
    //tableView對(duì)象
    @IBOutlet weak var tableView: UITableView!
     
    //歌曲列表數(shù)據(jù)源
    let musicListViewModel = MusicListViewModel()
     
    //負(fù)責(zé)對(duì)象銷毀
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //將數(shù)據(jù)源數(shù)據(jù)綁定到tableView上
        musicListViewModel.data
            .bind(to: tableView.rx.items(cellIdentifier:"musicCell")) { _, music, cell in
                cell.textLabel?.text = music.name
                cell.detailTextLabel?.text = music.singer
            }.disposed(by: disposeBag)
         
        //tableView點(diǎn)擊響應(yīng)
        tableView.rx.modelSelected(Music.self).subscribe(onNext: { music in
            print("你選中的歌曲信息【\(music)】")
        }).disposed(by: disposeBag)
    }
}

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薪鹦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惯豆,更是在濱河造成了極大的恐慌池磁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楷兽,死亡現(xiàn)場離奇詭異地熄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芯杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門端考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揭厚,你說我怎么就攤上這事却特。” “怎么了棋弥?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诚欠。 經(jīng)常有香客問我顽染,道長,這世上最難降的妖魔是什么轰绵? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任粉寞,我火速辦了婚禮,結(jié)果婚禮上左腔,老公的妹妹穿的比我還像新娘唧垦。我一直安慰自己,他們只是感情好液样,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布振亮。 她就那樣靜靜地躺著巧还,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坊秸。 梳的紋絲不亂的頭發(fā)上麸祷,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音褒搔,去河邊找鬼阶牍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛星瘾,可吹牛的內(nèi)容都是我干的走孽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼琳状,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼磕瓷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算撮,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤生宛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肮柜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陷舅,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年审洞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莱睁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芒澜,死狀恐怖仰剿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痴晦,我是刑警寧澤南吮,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站誊酌,受9級(jí)特大地震影響部凑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碧浊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一涂邀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱锐,春花似錦比勉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观蜗。三九已至,卻和暖如春赡勘,著一層夾襖步出監(jiān)牢的瞬間嫂便,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工闸与, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毙替,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓践樱,卻偏偏與公主長得像厂画,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拷邢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫袱院、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • RxSwift_v1.0筆記——24 Building a Complete RxSwift App 通過本書瞭稼,你...
    大灰很閱讀 1,859評(píng)論 3 1
  • 冬景 蘇軾 荷盡已無擎雨蓋, 菊殘猶有傲霜枝环肘。 一年好景君須記, 最是橙黃橘綠時(shí)欲虚。 秋末冬初的時(shí)候,荷花枯了悔雹,荷葉...
    九月湖心閱讀 172評(píng)論 0 0
  • (溫馨提示:閱讀本文約需要消耗您4分10秒复哆。) 一、組織 經(jīng)過上一步的整理腌零,你的待辦事項(xiàng)應(yīng)該精簡了許多梯找,但是還有很...
    清心瀾意閱讀 448評(píng)論 0 7
  • 《漂泊語錄》 文/黎峰 露珠兒打濕的春天還掛在門前的香椿樹上 這是童年的故鄉(xiāng),光芒萬丈飛短流長 唉益涧,提起童年我熱淚...
    黎峰小峰峰閱讀 241評(píng)論 4 12