RxSwift學習(Observable和Observer)

推薦書本:RxSwift
電子版地址:https://pan.baidu.com/s/1bp8MlC7 密碼 5tjx
本文是RxSwift書本 學習筆記
書本code地址:https://pan.baidu.com/s/1o7GVBrO

安裝RxSwift和RxCocoa

    pod 'RxSwift', '~> 3.3.1'
    pod 'RxCocoa', '~> 3.3.1'

學習時可在項目中創建playground進行。


截圖

創建方法

public func example(of description: String,action: ()->Void){
    print("======Example of : \(description)")
    action()
}

========================================
Observable和Observer

Observable相當于KVO里的被觀察對象,也是事件源。而Observer就是我們的觀察者,也就是當收到事件的時候去做某些處理。觀察者需要去訂閱(subscribe)被觀察者,才能收到Observable的事件通知消息。

========================================

just是創建一個sequence只能發出一種特定的事件,能正常結束(最后返回 completed )

例:

Observable<Int>.just(one)

Add this code to the bottom of the example:

example(of: "just, of , from"){
    let one = 1
    let two = 2
    let three = 3
    let observable: Observable<Int> =   
    Observable<Int>.just(one) //創建被觀察對象

//創建訂閱
    observable.subscribe{event in
        print(event)
    }
}

打印結果


打印結果

========================================
觀察者為每個元素發出一個.next 事件,然后發出一個.next 的事件,最后終止。
當使用觀測值時,您通常會對下一事件發出的元素更感興趣,而不是與事件本身相關。
要查看如何訪問這些代碼,請用下面的代碼替換上面

observable.subscribe { event in
  if let element = event.element {
    print(element)
  }
}

observable.subscribe(onNext: { element in
    print(element)
})

打印結果

empty就是創建一個空的sequence,只能發出一個completed事件
當你想返回一個可立即終止的或有意為零的可見值時。

example(of: "empty") {
  let observable = Observable<Void>.empty()
}
打印結果

========================================
never就是創建一個sequence,但是不發出任何事件信號。
與.empty相反,從.never符創建一個可見的,不釋放任何東西,從不終止。它可以用來表示無限長時間。

example(of: "never") {
    let observable = Observable<Any>.never()
    observable.subscribe(onNext: { element in
        print(element)
    }, onCompleted: {
        print("Completed")
    })
}
沒有打印Completed

========================================

range就是創建一個sequence,他會發出這個范圍中的從開始到結束的所有事件

example(of: "range") { 
    let observable = Observable<Int>.range(start: 1, count: 10)
    observable.subscribe(onNext: { i in
        let n = Double(i)
        let fibonacci = Int(((pow(1.61803, n) - pow(0.61803, n)) /
            2.23606).rounded())
        print(fibonacci)
    }, onCompleted: { 
        print("Completed")
    })
}
打印如下

========================================

DisposeBag
DisposeBag其實就相當于iOS中的ARC,會在適當的時候銷毀觀察者,相當于內存管理者吧。
使用adddisposableto()方法

example(of: "DisposeBag") {
  // 1
  let disposeBag = DisposeBag()
// 2
  Observable.of("A", "B", "C")
    .subscribe { // 3
print($0) }
    .addDisposableTo(disposeBag) // 4
}
}

create
我們也可以自定義可觀察的sequence,那就是使用create

example(of: "create") { 
    let disposeBag = DisposeBag()
    Observable<String>.create{ observer in
        observer.onNext("1")
        observer.onCompleted()
        observer.onNext("?")
        return Disposables.create()
    }.subscribe(onNext: {print($0)}, onError: {print($0)}, onCompleted: {print("Completed")}, onDisposed: {print("Disposed")}).addDisposableTo(disposeBag)
}
這里沒有打印 ?因為在之前就已經Completed了

========================================

onError 發出錯誤然后終止

example(of: "create") {
    enum MyError: Error{
        case anError
    }
    let disposeBag = DisposeBag()
    Observable<String>.create{ observer in
        observer.onError(MyError.anError)
        observer.onNext("1")
        
        observer.onCompleted()
        observer.onNext("?")
        return Disposables.create()
    }.subscribe(onNext: {print($0)}, onError: {print($0)}, onCompleted: {print("Completed")}, onDisposed: {print("Disposed")}).addDisposableTo(disposeBag)
}
1、? 和 Completed 不打印

========================================

deferred
deferred 會等到有訂閱者的時候再通過工廠方法創建 Observable 對象,每個訂閱者訂閱的對象都是內容相同而完全獨立的序列。

example(of: "deferred") { 
    let disposeBag = DisposeBag()
    
    var flip = false
    let factory: Observable<Int> = Observable.deferred({
        flip = !flip
        if flip{
            return Observable.of(1,2,3)
        }else{
            return Observable.of(4,5,6)
        }
    })
    
    for _ in 0...3{
        factory.subscribe(onNext: {print($0)}).addDisposableTo(disposeBag)
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容