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