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)點,大把大把的人在夸。我自己的感受是,雖然學習曲線比較陡峭,學習成本很高,一旦掌握了其開發(fā)技巧,收獲要比想象中多,值得去學習并實踐的框架。
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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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