之前介紹了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代理方法還是一如既往的繁多
接下來唱矛,在使用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)的代碼差異
- 不再需要聲明遵循tableView的DataSource與delegate代理以及實現(xiàn)所有代理方法渐北,Rx將其代理方法進行了封裝。
- 結(jié)構(gòu)體中的數(shù)據(jù)需要被RxSwift包裝成了Observable信號铭拧。
- 在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 博客