RxSwift 框架快速掌握(一)

前言

算了一下日子,我在北京已經呆了7年了。7年也讓我步入了大齡程序員的一列。不過還好,在這偌大的城市我安了家容下了我的身體和靈魂。

前段時間一直在玩RxSwift ,現在有很多的朋友在玩RxSwift,現在就簡單的記錄一下,怎麼能快速的學習和掌握框架.RxSwift其實並不是很難,你看了我寫的這篇你就明白了。

RxSwift 寶圖鎮博,你的小星星呢~~~~

![enter description here][1]

在這裏插入圖片描述

現在RxSwift的的成績非常不錯,也是我需要的去了解和學習的框架

![enter description here][3]

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”微信公衆號

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章