RxSwift(一)Creating and Subscribing to Observables 建立和訂閱觀察者

敖老黑發表於2018-01-03

0、Observable

在ReactiveX中,一個觀察者(Observer)訂閱一個可觀察物件(Observable)。觀察者對 Observable發射的資料或資料序列作出響應。這種模式可以極大地簡化併發操作,因為它建立了一個處於待命狀態的觀察者哨兵,在未來某個時刻響應Observable的通知,不需要阻塞 等待Observable發射資料。

圖片來自http://reactivex.io/documentation/observable.html
Observable

1、初始化playground

  • 初始化專案工程,pod引入RxSwift
  • 建立playground
  • 在playground\Sources下建立 support.swift檔案 填寫下面程式碼
  • Demo地址github.com/RockyAo/RxS….或者直接看官方的demo
import Foundation

public func exampleOf(description:String, action:  @escaping ()->Void)  {
    
    print("\n------exampleOf:\(description)------")
    
    action()
    
}

import PlaygroundSupport

public func playgroundShouldContinueIndefinitely() {
    PlaygroundPage.current.needsIndefiniteExecution = true
}

複製程式碼
  • 在playground中匯入RxSwift,RxCocoa

2、never

建立一個不發射任何資料的Observable


exampleOf(description:"never"){

    let disposeBag = DisposeBag()
    
    let neverSequence = Observable<String>.never()
    
    neverSequence.subscribe{ _ in
    
        print("永遠不會執行")
        
    }.disposed(by: disposeBag)
}
複製程式碼

3、empty

建立一個什麼都不做直接通知完成的Observable.它只傳送 .Completed 訊息。

exampleOf(description: "empty"){

    Observable<Int>.empty()
        .subscribe{ event in
            
            print(event)
            
    }.disposed(by: DisposeBag())
}

複製程式碼

4、just:

將一個或多個物件轉換成發射這個或這些物件的一個Observable,just 是隻包含一個元素的序列,它會先傳送 .Next(value) ,然後傳送 .Completed 。

exampleOf(description: "just"){

    Observable.just("我是物件")
        .subscribe{ event in
            
    
            print(event)
    }.addDisposableTo(DisposeBag())
}
複製程式碼

5、of

可以把一系列元素轉換成事件序列

exampleOf(description: "of"){

    Observable.of(1,2,3)
    .subscribe(onNext: { (event) in
        print(event)
    }, onError: { (error) in
        print(error)
    }, onCompleted: {
        print("訊號完成")
    }, onDisposed: { 
        print("訊號序列釋放")
    }).disposed(by: DisposeBag())
}
複製程式碼

6、from

from 是通過 asObservable() 方法把 Swift 中的序列 (SequenceType) 轉換成事件序列。例如:將一個陣列轉換成一個Observable

exampleOf(description: "from"){

    Observable.from(["lily","lilei","sb"])
    .subscribe(onNext: {
        
        print($0)
        
    }).disposed(by: DisposeBag())
    
}
複製程式碼

7、create

使用一個函式閉包從頭建立一個Observable,通過 .on(e: Event) 新增事件。

exampleOf(description: "create"){

    
    let myJust = { (element:String) -> Observable<String> in
    
        return Observable.create{ observable in
            
            observable.on(.next(element))
            
            observable.on(.completed)
            
            return Disposables.create()
        }
    }
    
    myJust("?")
        .subscribe{
    
            print($0)
    }.disposed(by: DisposeBag())
}

複製程式碼

8、range

建立一個發射特定整數序列的Observable

exampleOf(description: "range"){

    Observable.range(start: 1,count:10)
        .subscribe{
    
            print($0)
    }.disposed(by: DisposeBag())
}
複製程式碼

9、repeatElement

建立一個重複發射指定資料或資料序列的Observable,

exampleOf(description: "repeatElement" ){

    Observable.repeatElement("?")
        .take(3)//只發射3次
        .subscribe{print($0)}
        .disposed(by: DisposeBag())
}
複製程式碼

10、generate

發射所有條件為真的值的響應序列(這個是我猜的,有不同意見歡迎留言)

exampleOf(description: "generate"){

    Observable.generate(initialState: 0, condition: { (T) -> Bool in
        
        T < 3
        
    }, iterate: {  $0 + 1})
        .subscribe{
    
          print($0)
    }.addDisposableTo(DisposeBag())
}
複製程式碼

11、deferred

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

exampleOf(description: "deferred"){

    var count = 1
    
    let disposeBag = DisposeBag()
    
    let deferredSequence = Observable.deferred({ () -> Observable<String> in
        
        print("creat---\(count)")
        
        return Observable.create{ observable in
        
            print("發射~~~~...")
            observable.onNext("?")
            observable.onNext("?")
            observable.onNext("?")
            return Disposables.create()
        }
    })
    
    //第一個訂閱者
    
    deferredSequence.subscribe{
    
        print("第一個訂閱者--------")
        print($0)
    }.disposed(by: disposeBag)
    
    
    //第二個訂閱者
    deferredSequence.subscribe{
    
        print("第二個訂閱者")
        print($0)
    }.disposed(by: disposeBag)
}


複製程式碼

12、error

建立一個什麼都不做直接通知錯誤的Observable

exampleOf(description: "error"){

    enum testError:Error{
    
        case bigError
    }
    
    Observable<Int>.error(testError.bigError).subscribe{
    
        print($0)
    }
}
複製程式碼

13、doOn

doOn 可以監聽事件,並且在事件發生之前呼叫。

exampleOf(description: "doOn") { 
    
    Observable.of(1,2,3,4).do(onNext: { (event) in
        print(event)
    }, onError: { (error) in
        print(error)
    }, onCompleted: {
        print("完成")
    }, onSubscribe: {
        print("訂閱")
    }, onDispose: { 
        print("釋放")
    }).subscribe{
        
        print($0)
    }.disposed(by: DisposeBag())
}
複製程式碼

相關文章