Functional programming
以 function 為單位,一個 function 的 input 可以是一個 function 或是 value,
而 function 的 output 也可以是一個 function 或是 value 而作為下一個 function 的 input,
這樣透過一連串的計算函式設計來得到結果,並且限制無法使用變數或是狀態來避免造成 side effect。
Reactive programming
以 data streams / data flow 為概念作為設計,
reactive programming 將所有的東西當作 data,包含 click event 或 http request 等等,
並且透過 functional programming 的設計將所有 data 串為一個 stream,
且這些 data 可透過 asynchronize 產生,
因此可以理解成,當一個 data,如 click event 執行相對應的 function,
這個 function 會產生下一個 function 的 input,下一個 data,如 pop alert 執行相對應的 function,
就會是下一個 function。
RxSwift
RxSwift - 與 Swift 溝通的 framework
RxCocoa - 透過 reactive 的方式來使用 Cocoa API 的 framework
Observable - 發出改變的被觀察對象
Observer - 監聽 observable 的觀察者
Disposable - 管理觀察者的記憶體
建立 Observable
Observable 可透過事件發出改變值或特定信號給觀察者,事件有 onNext, onError 與 onCompleted。
若發出 onCompleted 或 onError 事件,會使得整個 stream 終止並解除觀察者的監聽。
let observableSample: Observable<Int> = Observable.create { (observer) -> Disposable in
observer.onNext(1)
return Disposables.create()
}
建立 Observer
建立方法有兩種。
1 初始化 observer
let observerSampleA: AnyObserver<Int> = AnyObserver { (event) in
}
observableSample.subscribe(observerSampleA)
2 使用 closure
observableSample.subscribe { (event) in
}
Observable type
RxSwift 提供不同類型的 observable 可以直接呼叫使用。
- Single
> 只能發出一個改變值 "或" 一個 error
- Completable
> 不發出任何改變值,只能發出一個 completed "或" 一個 error
- Maybe
> 只能發出一個改變值 "或" 發出一個 completed "或" 一個 error
- Driver
Driver 保證不會產生 error,且會在 main thread 執行加上改變的狀態共享。
這種類型的 observable 可以安全的與 UI 事件做結合,
確保執行到 UI 相關的 function 時會在 main thread 執行且不會因為產生 error 而解除觀察。
let observableSample: Observable<String> = Observable.create { (observer) -> Disposable in return Disposables.create() } let driver = observableSample.asDriver(onErrorJustReturn: "error") driver.drive(label.rx.text)
Observer type
- Binder
除了前面提到的 AnyObserver 外,Binder 用來特別處理 UI 事件,
不會處理 error 也可以在特定的 thread 上執行,default 為 main thread。
let observer: Binder<String> = Binder(label) { (view, text) in view.text = text }