RxSwift介紹(一)——RxSwift初探

之前介紹了RAC在Objective-C環(huán)境下RACSignal信號訂閱使用流程珠插、宏定義以及各種信號的操作使用。作為函數(shù)式響應(yīng)編程的代表颖对,就不得不提RxSwift捻撑。
在swift環(huán)境下,RAC的孿生兄弟RxSwift同樣提供了相同的框架使用惜互,并且基于swift語言的優(yōu)點布讹,RxSwift甚至能夠更簡潔地開發(fā)業(yè)務(wù)代碼。關(guān)于RxSwift的優(yōu)點训堆,大把大把的人在夸描验。我自己的感受是,雖然學(xué)習(xí)曲線比較陡峭坑鱼,學(xué)習(xí)成本很高膘流,一旦掌握了其開發(fā)技巧,收獲要比想象中多鲁沥,值得去學(xué)習(xí)并實踐的框架呼股。
RxSwift拓展了觀察者模式,使開發(fā)者能夠自由組合多個異步事件画恰,而不需要去關(guān)心線程彭谁,同步,線程安全允扇,并發(fā)數(shù)據(jù)以及I/O阻塞缠局。
接下來先看一個最常用的例子则奥,swift環(huán)境中搭建一個簡單的tableView。這里往往需要遵循TableView相關(guān)的各種代理方法狭园,下面是使用結(jié)構(gòu)體生成一串簡單的數(shù)組并放入tableView中顯示內(nèi)容读处。

//使用結(jié)構(gòu)體生成tableView的數(shù)據(jù)源
struct DemoModel {
    var firstKey:String
    var secondKey:Int
    init(firstKey:String, secondKey:Int) {
        self.firstKey = firstKey
        self.secondKey = secondKey
    }
}

struct DemoViewModel {
    let infoAry = [DemoModel(firstKey: "1-1", secondKey: 1),
                                   DemoModel(firstKey: "1-2", secondKey: 2),
                                   DemoModel(firstKey: "1-3", secondKey: 3),
                                   DemoModel(firstKey: "1-4", secondKey: 4)]
}

生成好了數(shù)據(jù)之后初始化,再來看看tableView的代碼實現(xiàn)


tableView在swift環(huán)境下的實現(xiàn)

遵循的tableView代理方法還是一如既往的繁多
接下來唱矛,在使用RxSwift框架下改造上面的tableView罚舱,來感受下RxSwift的強大。
首先引入RxCocoa與RxSwift绎谦。在RxSwift中管闷,不再需要去挨個遵循tableView的各種代理方法,直接上修改后的代碼

class ViewController: UIViewController {
    
    lazy var firstTableView: UITableView = UITableView()
    let resuerId:String = "firstCell"
    let viewModel = DemoViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        createTableView()
        bindViewModel()
    }
}

extension ViewController{
    func createTableView() -> Void {
        view.addSubview(firstTableView)
        firstTableView.frame = view.bounds;
        firstTableView.backgroundColor = UIColor.orange
        firstTableView.register(UITableViewCell.self, forCellReuseIdentifier: resuerId)
    }
    
    func bindViewModel() -> Void {
//此方法將viewModel與tableView進行綁定
        viewModel.infoAry.bind(to: firstTableView.rx.items(cellIdentifier:resuerId)){
            row,model,cell in
//cell的具體顯示內(nèi)容可在此處自定義
            cell.textLabel?.text = "firstKey \(model.firstKey), secondKey \(model.secondKey), row = \(row)"
        }.disposed(by: disposeBag)
//點擊cell的響應(yīng)事件
        firstTableView.rx.modelSelected(DemoModel.self).subscribe(onNext: { (model) in
            print("select \(model.firstKey)")
        }).disposed(by: disposeBag)
    }
}


struct DemoModel {
    var firstKey:String
    var secondKey:Int
    init(firstKey:String, secondKey:Int) {
        self.firstKey = firstKey
        self.secondKey = secondKey
    }
}

struct DemoViewModel {
//結(jié)構(gòu)體中的數(shù)組被包裝成了Observable
    let infoAry = Observable.just([DemoModel(firstKey: "1-1", secondKey: 1),
                                   DemoModel(firstKey: "1-2", secondKey: 2),
                                   DemoModel(firstKey: "1-3", secondKey: 3),
                                   DemoModel(firstKey: "1-4", secondKey: 4)])
}

使用RxSwift框架實現(xiàn)的tableView燥滑,與原生實現(xiàn)的代碼差異

  1. 不再需要聲明遵循tableView的DataSource與delegate代理以及實現(xiàn)所有代理方法渐北,Rx將其代理方法進行了封裝。
  2. 結(jié)構(gòu)體中的數(shù)據(jù)需要被RxSwift包裝成了Observable信號铭拧。
  3. 在RAC中使用的組合式銷毀來集中管理銷毀RACSignal赃蛛,而在RxSwift中與RAC類似的使用到了DisposeBag來實現(xiàn)Observable的集中銷毀管理。在視圖控制器或者其持有者將要銷毀的時候搀菩,會自動釋放掉綁定在它上面的資源呕臂。它是通過類似“訂閱處置機制”方式實現(xiàn)(類似于 NotificationCenter 的 removeObserver)。

上手寫代碼的過程中肪跋,發(fā)現(xiàn)RxSwift的編譯器代碼提示在Xcode下實在是不友好歧蒋,代碼提示有時完全失效,只能手動寫入其實現(xiàn)的方法與參數(shù)
現(xiàn)在了解了RxSwift框架的基本使用州既,在RxSwift的官方鏈接中也有demo可供參考谜洽,接下來一步一步深入分析RxSwift實現(xiàn)原理。關(guān)于RxSwift吴叶,計劃在最后放幾個自己用RxSwift實現(xiàn)的小demo阐虚,畢竟紙上得來終覺淺,還是要放到項目中體會蚌卤。


該文章首次發(fā)表在 簡書:我只不過是出來寫寫代碼 博客实束,并自動同步至 騰訊云:我只不過是出來寫寫iOS 博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逊彭,隨后出現(xiàn)的幾起案子咸灿,更是在濱河造成了極大的恐慌,老刑警劉巖侮叮,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件避矢,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機审胸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門分尸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歹嘹,你說我怎么就攤上這事】淄ィ” “怎么了尺上?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圆到。 經(jīng)常有香客問我怎抛,道長,這世上最難降的妖魔是什么芽淡? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任马绝,我火速辦了婚禮,結(jié)果婚禮上挣菲,老公的妹妹穿的比我還像新娘富稻。我一直安慰自己,他們只是感情好白胀,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布椭赋。 她就那樣靜靜地躺著,像睡著了一般或杠。 火紅的嫁衣襯著肌膚如雪哪怔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天向抢,我揣著相機與錄音认境,去河邊找鬼。 笑死挟鸠,一個胖子當(dāng)著我的面吹牛叉信,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兄猩,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茉盏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枢冤?” 一聲冷哼從身側(cè)響起鸠姨,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淹真,沒想到半個月后讶迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡核蘸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年巍糯,在試婚紗的時候發(fā)現(xiàn)自己被綠了啸驯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟峦,死狀恐怖罚斗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宅楞,我是刑警寧澤针姿,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站厌衙,受9級特大地震影響距淫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婶希,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一榕暇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喻杈,春花似錦彤枢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龄砰,卻和暖如春盟猖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背换棚。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工式镐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人固蚤。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓娘汞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夕玩。 傳聞我的和親對象是個殘疾皇子你弦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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