前言
算了一下日子,我在北京已經呆了7年了。7年也讓我步入了大齡程序員的一列。不過還好,在這偌大的城市我安了家容下了我的身體和靈魂。
前段時間一直在玩RxSwift ,現在有很多的朋友在玩RxSwift,現在就簡單的記錄一下,怎麼能快速的學習和掌握框架.RxSwift其實並不是很難,你看了我寫的這篇你就明白了。
RxSwift 寶圖鎮博,你的小星星呢~~~~
現在RxSwift
的的成績非常不錯,也是我需要的去了解和學習的框架
ReactiveX這個家族非常牛逼,寫了很多框架:
今天我們就來看看RxSwift
,RxSwift
的導入和編譯自行百度
import RxSwift
import RxCocoa
class ViewController: UIViewController{
lazy var tableView: UITableView = UITableView()
let reuserId:String = "cell"//重用標識
let infoViewModel: InfoViewModel = InfoViewModel()//數據viewmodel
//DisposeBag:作用是 Rx 在視圖控制器或者其持有者將要銷燬的時候,自動釋法掉綁定在它上面的資源。它是通過類似“訂閱處置機制”方式實現(類似於 NotificationCenter 的 removeObserver)。
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
//rx.items(cellIdentifier:):這是 Rx 基於 cellForRowAt 數據源方法的一個封裝。傳統方式中我們還要有個 numberOfRowsInSection 方法,使用 Rx 後就不再需要了(Rx 已經幫我們完成了相關工作)。
infoViewModel.infoArray.bind(to: tableView.rx.items(cellIdentifier: reuserId)){
row,model,cell in
cell.textLabel?.text = "\(model.name) age == \(model.age) row = \(row)"
}.disposed(by: disposeBag)
//rx.modelSelected: 這是 Rx 基於 UITableView委託回調方法 didSelectRowAt 的一個封裝。
tableView.rx.modelSelected(InfoModel.self).subscribe(onNext: { (model) in
print("點擊了 \(model.name) age==\(model.age)")
}).disposed(by: disposeBag)
}
}
//MARK: 設置UI相關
extension ViewController{
func setupUI(){
view.addSubview(tableView)
tableView.frame = view.bounds
tableView.backgroundColor = UIColor.white
tableView .register(UITableViewCell.self, forCellReuseIdentifier: reuserId)
}
}
//MARK: model
struct InfoModel {
let name:String //名字
let age:Int //年紀
init(name:String,age:Int) {
self.name = name
self.age = age
}
}
//MARK: 方便輸出打印
extension InfoModel:CustomStringConvertible{
var description:String{
return "name==\(name),age==\(age)"
}
}
struct InfoViewModel {
//MARK: 模擬假數據
let infoArray = Observable.just([
InfoModel(name: "Cooci", age: 19),
InfoModel(name: "CC", age: 18),
InfoModel(name: "James", age: 17),
InfoModel(name: "Gavin", age: 16),
InfoModel(name: "Dean", age: 15),
])
}
代碼我們儘量精簡,要保持一個清晰的思路,這樣下來就很舒服,也不凌亂
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeB = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//通過指定的方法實現來自定義一個被觀察的序列。
//訂閱創建
let myOb = Observable<Any>.create { (observ) -> Disposable in
observ.onNext("cooci")
observ.onCompleted()
return Disposables.create()
}
//訂閱事件
myOb.subscribe { (even) in
print(even)
}.disposed(by: disposeB)//銷燬
//各種觀察者序列產生方式
//該方法通過傳入一個默認值來初始化。
Observable.just("just")
.subscribe { (event) in
print(event)
}
.disposed(by: disposeB)
//該方法可以接受可變數量的參數(必需要是同類型的)
Observable.of("o","f","of").subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法需要一個數組參數。
Observable.from(["f","r","o","m"]).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創建一個永遠不會發出 Event(也不會終止)的 Observable 序列。
Observable<Int>.never().subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創建一個空內容的 Observable 序列。 //會打印complete
Observable<Int>.empty().subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創建一個不做任何操作,而是直接發送一個錯誤的 Observable 序列。
let myError = MyError.A
// print(myError.errorType)
Observable<Int>.error(myError).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法通過指定起始和結束數值,創建一個以這個範圍內所有值作爲初始值的Observable序列。
Observable.range(start: 1, count: 6).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創建一個可以無限發出給定元素的 Event的 Observable 序列(永不終止)。
// Observable.repeatElement("Cooci").subscribe { (event) in
// print(event)
// }.disposed(by: disposeB)
//該方法創建一個只有當提供的所有的判斷條件都爲 true 的時候,纔會給出動作的 Observable 序列。
//第一個參數:初始化的數值 第二個 條件 第三也是一個條件 0 + 2 <= 10 依次循環下去,iterate:重複執行
Observable.generate(initialState: 0, condition: {$0<=10}, iterate: {$0+2}).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//上面和下面的效果一樣
Observable.of(0,2,4,6,8,10).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該個方法相當於是創建一個 Observable 工廠,通過傳入一個 block 來執行延遲 Observable序列創建的行爲,而這個 block 裏就是真正的實例化序列對象的地方。
var isOdd = true
let factory: Observable<Int> = Observable.deferred { () -> Observable<Int> in
isOdd = !isOdd
if isOdd{
return Observable.of(0,2,4,6,8)
}else{
return Observable.of(1,3,5,7,9)
}
}
factory.subscribe { (event) in
print("\(isOdd)",event)
}.disposed(by: disposeB)
factory.subscribe { (event) in
print("\(isOdd)",event)
}.disposed(by: disposeB)
//這個方法創建的 Observable 序列每隔一段設定的時間,會發出一個索引數的元素。而且它會一直髮送下去。
// Observable<Int>.interval(1, scheduler: MainScheduler.instance).subscribe { (event) in
// print(event)
// }.disposed(by: disposeB)
//這個方法有兩種用法,一種是創建的 Observable序列在經過設定的一段時間後,產生唯一的一個元素。
// Observable<Int>.timer(1, scheduler: MainScheduler.instance).subscribe{(event) in
// print("123",event)
// }.disposed(by: disposeB)
//
//
//另一種是創建的 Observable 序列在經過設定的一段時間後,每隔一段時間產生一個元素。
Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
}
enum MyError:Error {
case A
case B
var errorType:String {
switch self {
case .A:
return "i am error A"
case .B:
return "BBBB"
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
上面這段代碼是介紹的
Observable
的序列產生,也是非常簡單,輕量化
關於 iOSSir 技術 iOSSir是由一些只玩iOS技術的小夥伴打造的技術分享公衆號,每天推送技術乾貨內容
更多技術信息歡迎關注“iOSSir”微信公衆號