推薦書本: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")
})
}
========================================
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)
}
========================================
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)
}
========================================
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)
}
}