-
首先,何為
RxSwift
?
RxSwift
是ReactiveX
的Swift
版本,一個響應(yīng)式變成框架儒旬。傳送門
-
開始之前,先介紹兩個
function
,并沒有什么實(shí)質(zhì)性作用,只是為了方便學(xué)習(xí)演示
/**
延遲`delay`時長之后執(zhí)行`closure`閉包
- parameter delay: 閉包延遲執(zhí)行時間
- parameter closure: 返回值`Void`的閉包
*/
public func delay(_ delay: Double, closure: @escaping (Swift.Void) -> Swift.Void)
/**
起到一個分割線作用
- parameter description: example 簡介
- parameter action: 返回值`Void`的閉包
*/
public func example(_ description: String, action: (Swift.Void) -> Swift.Void)
-
RxSwift
基礎(chǔ)
Observable
:Observable
是觀察著模式中的被觀察對象,相當(dāng)于一個事件序列GeneratorType
,它會向它的訂閱者發(fā)送事件信息,
-
next()
:一個新的事件 -
complete()
:完成事件 -
error()
: 錯誤事件
多數(shù)情況都是對不同的
Observable
進(jìn)行subscribe
操作,并在接收到事件后進(jìn)行相應(yīng)的操作
-
名詞解釋
-
DisposeBag
相當(dāng)于一個
autoreleasepool(自動釋放池)
,對觀察者進(jìn)行管理,在適當(dāng)?shù)臅r候銷毀觀察者
-
Observable
Observables will not execute their subscription closure unless there is a subscriber
Observables只有被訂閱之后才會被執(zhí)行,否則不予執(zhí)行
```
example("一個未被訂閱的Observable") {
_ = Observable<String>.create { observerOfString -> Disposable in
print("This will never be printed")
observerOfString.on(.next("??"))
observerOfString.on(.completed)
return Disposables.create()
}
}
//不會打印任何數(shù)據(jù),因?yàn)樵揙bservable沒有被訂閱
- ###### subscribe
> subscribe是訂閱`sequence`發(fā)出的事件温兼,比如`next`事件秸滴,`error`事件等。而`subscribe(onNext:)`是監(jiān)聽`sequence`發(fā)出的`next`事件中的`element`進(jìn)行處理募判,他會忽略`error`和`completed`事件荡含。相對應(yīng)的還有`subscribe(onError:) `和 `subscribe(onCompleted:)`
```
example("被訂閱的Observable") {
let disposeBag = DisposeBag()
Observable<String>.create { observerOfString in
print("Observable created")
observerOfString.on(.next("??"))
observerOfString.on(.completed)
return Disposables.create()
}
.subscribe { event in
print(event)
}.addDisposableTo(disposeBag)
}
執(zhí)行結(jié)果:
--- 被訂閱的Observable ---
Observable created
next(??)
completed
-
Creating and Subscribing to Observables
/ 創(chuàng)建并訂閱Observables
-
never
創(chuàng)建一個空序列,不發(fā)送任何事件
example("never") {
let disposeBag = DisposeBag()
let neverSequence = Observable<String>.never()
neverSequence
.subscribe { _ in
print("This will never be printed")
}
.addDisposableTo(disposeBag)
}
-
empty
一個空的序列咒唆,它只發(fā)送 .Completed 消息
example("empty") {
let disposeBag = DisposeBag()
Observable<Int>.empty()
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- empty example ---
completed
-
just
只包含一個元素的序列,發(fā)送一個next事件和completed事件
example("just") {
let disposeBag = DisposeBag()
Observable.just("??")
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- just example ---
next(??)
completed
-
of
將所有元素依次轉(zhuǎn)換為序列發(fā)送
example("of") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??")
.subscribe(onNext: { element in
print(element)
})
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果
--- of example ---
??
??
??
??
-
from
從數(shù)組或字典或集合的所有元素創(chuàng)建序列發(fā)送
example("from") {
let disposeBag = DisposeBag()
Observable.from(["??", "??", "??", "??"])
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果
--- from example ---
??
??
??
??
-
create
創(chuàng)建一個自定義Observable
example("create") {
let disposeBag = DisposeBag()
let myJust = { (element: String) -> Observable<String> in
return Observable.create { observer in
observer.on(.next(element))
observer.on(.completed)
return Disposables.create()
}
}
myJust("??")
.subscribe { print($0) }
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- create example ---
next(??)
completed
-
error
創(chuàng)建一個只發(fā)送error事件的Observable
example("error") {
let disposeBag = DisposeBag()
Observable<Int>.error(TestError.test)
.subscribe { print($0) }
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- error example ---
error(test)
-
Subject
Subject
可以訂閱別的Observable
,也可以被訂閱并給它的訂閱者發(fā)送事件
常用:
PublishSubject
ReplaySubject
BehaviorSubject
Variable
-
PublishSubject
它的訂閱者只能接收到訂閱后發(fā)送的事件,無法接收到訂閱之前的事件
example("PublishSubject") {
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject.addObserver("1").disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject.addObserver("2").disposed(by: disposeBag)
subject.onNext("???")
subject.onNext("???")
}
//執(zhí)行結(jié)果:
--- PublishSubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
-
ReplaySubject
它的訂閱者定接收到訂閱之后發(fā)出的事件,并且能接收到訂閱之前的信號,至于能接收到訂閱之前的多少個信號則由 bufferSize 參數(shù)決定
example("ReplaySubject") {
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 1)
subject.addObserver("1").disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject.addObserver("2").disposed(by: disposeBag)
subject.onNext("???")
subject.onNext("???")
}
//執(zhí)行結(jié)果:
--- ReplaySubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
-
BehaviorSubject
它的訂閱者定接收到訂閱之后發(fā)出的事件,并且能接收到訂閱之前的前一個信號
example("BehaviorSubject") {
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "??")
subject.addObserver("1").disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
subject.addObserver("2").disposed(by: disposeBag)
subject.onNext("???")
subject.onNext("???")
subject.addObserver("3").disposed(by: disposeBag)
subject.onNext("??")
subject.onNext("??")
}
//執(zhí)行結(jié)果:
--- BehaviorSubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 3 Event: next(???)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)
-
Variable
它的訂閱者定接收到訂閱之后發(fā)出的事件和訂閱之前的前一個信號,并且當(dāng)它的 value 發(fā)生改變時所有的訂閱者能收到事件,完成后向所有訂閱者發(fā)送 complete 事件
example("Variable") {
let disposeBag = DisposeBag()
let variable = Variable("??")
variable.asObservable().addObserver("1").disposed(by: disposeBag)
variable.value = "??"
variable.value = "??"
variable.asObservable().addObserver("2").disposed(by: disposeBag)
variable.value = "???"
variable.value = "???"
}
//執(zhí)行結(jié)果:
--- Variable example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: completed
Subscription: 2 Event: completed
-
組合操作
-
startWith
這個不好描述,看代碼,別說話,用心去感受
example("startWith") {
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??")
.startWith("1")
.startWith("2")
.startWith("3", "???", "???")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- startWith example ---
3
???
???
2
1
??
??
??
??
-
merge
把兩個隊列按照順序組合在一起
example("merge") {
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("???")
subject1.onNext("???")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("??")
subject2.onNext("③")
}
//執(zhí)行結(jié)果:
--- merge example ---
???
???
①
②
??
③
-
zip
將多個序列組合在一起,當(dāng)所有序列能湊成一組(一一對應(yīng))時才發(fā)送事件
example("zip") {
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSubject.onNext("???")
stringSubject.onNext("???")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("??")
intSubject.onNext(3)
}
//執(zhí)行結(jié)果:
--- zip example ---
??? 1
??? 2
?? 3
-
combineLatest
多個序列合并,每個序列的最新值進(jìn)行組合
example("combineLatest") {
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSubject.onNext("???")
stringSubject.onNext("???")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("??")
}
//執(zhí)行結(jié)果:
--- combineLatest example ---
??? 1
??? 2
?? 2
-
轉(zhuǎn)換操作
-
map
對序列的值做轉(zhuǎn)換操作后返回,序列的值發(fā)生改變
example("map") {
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * $0 } //1*1 2*2 3*3
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
//執(zhí)行結(jié)果:
--- map example ---
1
4
9
-
flatMap and flatMapLatest
看代碼
example("flatMap and flatMapLatest") {
let disposeBag = DisposeBag()
struct Player {
var score: Variable<Int>
}
let ???? = Player(score: Variable(80))
let ???? = Player(score: Variable(90))
let player = Variable(????)
player.asObservable()
.flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
????.score.value = 85
player.value = ????
????.score.value = 95 // Will be printed when using flatMap, but will not be printed when using flatMapLatest
????.score.value = 100
}
//執(zhí)行結(jié)果:
--- flatMap and flatMapLatest example ---
80
85
90
95
100