RxSwift 深入淺出(一)RxSwift初探

前段時間一直在玩RxSwift 洽胶,現(xiàn)在記錄一下這個牛逼罐呼,讓人欲罷不能的框架.RxSwift看我就夠了

RxSwift 寶圖鎮(zhèn)博,咔咔點贊~~~~

Rxswift
RxSwift

現(xiàn)在RxSwift的的成績非常不錯,一看就知道是大虐缶框架

start

ReactiveX這個家族非常牛逼奉狈,寫了很多框架:

.....

今天我們就來看看RxSwift
RxSwift的導(dǎo)入和編譯自行百度鳖昌,

import RxSwift
import RxCocoa

class ViewController: UIViewController{

    lazy var tableView: UITableView = UITableView()
    let reuserId:String = "cell"http://重用標(biāo)識
    let infoViewModel: InfoViewModel = InfoViewModel()//數(shù)據(jù)viewmodel
    //DisposeBag:作用是 Rx 在視圖控制器或者其持有者將要銷毀的時候备畦,自動釋法掉綁定在它上面的資源。它是通過類似“訂閱處置機制”方式實現(xiàn)(類似于 NotificationCenter 的 removeObserver)许昨。
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        
        //rx.items(cellIdentifier:):這是 Rx 基于 cellForRowAt 數(shù)據(jù)源方法的一個封裝懂盐。傳統(tǒng)方式中我們還要有個 numberOfRowsInSection 方法,使用 Rx 后就不再需要了(Rx 已經(jīng)幫我們完成了相關(guān)工作)糕档。
        
        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委托回調(diào)方法 didSelectRowAt 的一個封裝允粤。
        tableView.rx.modelSelected(InfoModel.self).subscribe(onNext: { (model) in
            print("點擊了 \(model.name) age==\(model.age)")
        }).disposed(by: disposeBag)
        
    }
}

//MARK: 設(shè)置UI相關(guān)
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 //年紀(jì)
    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: 模擬假數(shù)據(jù)
    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),
        ])
}

看了上面的代碼是不是感覺賊爽,代碼量大大精簡翼岁,思路更加清晰类垫,簡直完美,優(yōu)秀琅坡,還有~誰

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.

        //通過指定的方法實現(xiàn)來自定義一個被觀察的序列悉患。
        //訂閱創(chuàng)建
        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)//銷毀

        //各種觀察者序列產(chǎn)生方式
        
        //該方法通過傳入一個默認值來初始化。
        Observable.just("just")
            .subscribe { (event) in
            print(event)
        }
            .disposed(by: disposeB)
        
        //該方法可以接受可變數(shù)量的參數(shù)(必需要是同類型的)
        Observable.of("o","f","of").subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法需要一個數(shù)組參數(shù)榆俺。
        Observable.from(["f","r","o","m"]).subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法創(chuàng)建一個永遠不會發(fā)出 Event(也不會終止)的 Observable 序列售躁。
        Observable<Int>.never().subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法創(chuàng)建一個空內(nèi)容的 Observable 序列坞淮。 //會打印complete
        Observable<Int>.empty().subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法創(chuàng)建一個不做任何操作,而是直接發(fā)送一個錯誤的 Observable 序列陪捷。
        let myError = MyError.A
//        print(myError.errorType)
        Observable<Int>.error(myError).subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法通過指定起始和結(jié)束數(shù)值回窘,創(chuàng)建一個以這個范圍內(nèi)所有值作為初始值的Observable序列。
        Observable.range(start: 1, count: 6).subscribe { (event) in
            print(event)
        }.disposed(by: disposeB)
        
        //該方法創(chuàng)建一個可以無限發(fā)出給定元素的 Event的 Observable 序列(永不終止)市袖。
//        Observable.repeatElement("Cooci").subscribe { (event) in
//            print(event)
//        }.disposed(by: disposeB)
        
        //該方法創(chuàng)建一個只有當(dāng)提供的所有的判斷條件都為 true 的時候啡直,才會給出動作的 Observable 序列。
        //第一個參數(shù):初始化的數(shù)值  第二個 條件  第三也是一個條件 0 + 2 <= 10 依次循環(huán)下去,iterate:重復(fù)執(zhí)行
        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)
        
        //該個方法相當(dāng)于是創(chuàng)建一個 Observable 工廠苍碟,通過傳入一個 block 來執(zhí)行延遲 Observable序列創(chuàng)建的行為酒觅,而這個 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)
        
        
        //這個方法創(chuàng)建的 Observable 序列每隔一段設(shè)定的時間微峰,會發(fā)出一個索引數(shù)的元素舷丹。而且它會一直發(fā)送下去。
        
//        Observable<Int>.interval(1, scheduler: MainScheduler.instance).subscribe { (event) in
//            print(event)
//        }.disposed(by: disposeB)
        
        //這個方法有兩種用法蜓肆,一種是創(chuàng)建的 Observable序列在經(jīng)過設(shè)定的一段時間后颜凯,產(chǎn)生唯一的一個元素。
//        Observable<Int>.timer(1, scheduler: MainScheduler.instance).subscribe{(event) in
//            print("123",event)
//        }.disposed(by: disposeB)
//
//
        //另一種是創(chuàng)建的 Observable 序列在經(jīng)過設(shè)定的一段時間后仗扬,每隔一段時間產(chǎn)生一個元素装获。
        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的序列產(chǎn)生,也是非常簡單厉颤,輕量化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穴豫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逼友,更是在濱河造成了極大的恐慌精肃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜乞,死亡現(xiàn)場離奇詭異司抱,居然都是意外死亡,警方通過查閱死者的電腦和手機黎烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門习柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照棋,你說我怎么就攤上這事资溃。” “怎么了烈炭?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵溶锭,是天一觀的道長。 經(jīng)常有香客問我符隙,道長趴捅,這世上最難降的妖魔是什么垫毙? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拱绑,結(jié)果婚禮上综芥,老公的妹妹穿的比我還像新娘。我一直安慰自己猎拨,他們只是感情好膀藐,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迟几,像睡著了一般消请。 火紅的嫁衣襯著肌膚如雪栏笆。 梳的紋絲不亂的頭發(fā)上类腮,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音蛉加,去河邊找鬼蚜枢。 笑死,一個胖子當(dāng)著我的面吹牛针饥,可吹牛的內(nèi)容都是我干的厂抽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丁眼,長吁一口氣:“原來是場噩夢啊……” “哼筷凤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苞七,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤藐守,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹂风,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卢厂,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年惠啄,在試婚紗的時候發(fā)現(xiàn)自己被綠了慎恒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撵渡,死狀恐怖融柬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趋距,我是刑警寧澤丹鸿,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站棚品,受9級特大地震影響靠欢,放射性物質(zhì)發(fā)生泄漏廊敌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一门怪、第九天 我趴在偏房一處隱蔽的房頂上張望骡澈。 院中可真熱鬧,春花似錦掷空、人聲如沸肋殴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护锤。三九已至,卻和暖如春酿傍,著一層夾襖步出監(jiān)牢的瞬間烙懦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工赤炒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氯析,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓莺褒,卻偏偏與公主長得像掩缓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遵岩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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