簡介
Rx簡介
RxSwift是Rx家族對swift語言的封裝。什么是Rx呢?全稱是ReactiveX。官方對自己的定義如下:
An API for asynchronous programming with observable streams
一組帶有可觀察流的異步編程API。ReactiveX結(jié)合了觀察者模式(Observer pattern)、迭代器模式(Iterator pattern)、函數(shù)式編程(functional programming)的思想。
ReactiveX通過使用可觀察的序列來組合異步和基于事件的程序。它擴展了觀察者模式以支持數(shù)據(jù)和事件序列,并且允許使用運算符將各種序列組合起來處理。這樣不僅簡化了異步事件響應的復雜度,同時消除了低級線程、同步、線程安全、并發(fā)數(shù)據(jù)結(jié)構(gòu)等問題。
RxSwift簡介
RxSwift作為Rx的一員,它結(jié)合了傳統(tǒng)Cocoa編程和純函數(shù)編程的優(yōu)點。它允許對事件作出反應,方法是使用不可變的代碼定義以確定性的、可組合的方式處理異步輸入部分。
RxSwift的核心組成部分如下:
-
observable:可觀察序列,響應事件、訂閱事件 -
observer:觀察者,觀察事件、發(fā)送信號 -
operator:操作符,組合變換觀察者信號 -
scheduler:調(diào)度,調(diào)度觀察事件的執(zhí)行 -
disposable:管理事件訂閱的生命周期
可以說Observable就是Rx的基礎(chǔ):任何事件或者任務(wù)的執(zhí)行都可以攜帶信號,而這些信號又可以被任何訂閱了類或者對象使用。不管是同步或者異步,只要是信號發(fā)出,訂閱者必然能夠接受到。
RxSwift的事件類型分為以下三種:
-
next:下一個事件,可以理解為發(fā)送正常的信號、傳遞數(shù)據(jù)事件 -
error:錯誤事件,發(fā)送出錯誤信號,意味著發(fā)送者不會發(fā)出其他事件,而接收者也不會再接收到信號。 -
completed:完成事件,意味著觀察序列終止,發(fā)送者不會發(fā)出任何其他事件,而接收者也不會再接收到信號。在發(fā)送的時候,completed和error只能出現(xiàn)一個。
RxSwift簡單使用
RxSwift對很多事件和機制都做了封裝,可以更方便的使用
KVO
func testKVO() {
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value ?? "")
})
.disposed(by: disposeBag)
}
Notification
func testNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (noti) in
print(noti)
})
.disposed(by: disposeBag)
}
Delegate
func testScrollerView() {
scrollView.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
print(content)
})
.disposed(by: disposeBag)
}
UI事件響應
UITextField
UITextField響應代理:
func testTextFiled() {
self.textFiled.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text)
})
.disposed(by: disposeBag)
}
控件綁定,將輸入框的文案,綁定到按鈕上。
self.textFiled.rx.text
.bind(to: self.button.rx.title())
.disposed(by: disposeBag)
UIButton
func testButton() {
self.button.rx.tap
.subscribe(onNext: { () in
print("點擊事件")
})
.disposed(by: disposeBag)
// 修改button的事件類型
self.button.rx.controlEvent(.touchUpOutside)
}
UIGestureRecognizer
func testGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe(onNext: { (tap) in
print(tap)
})
.disposed(by: disposeBag)
}
定時器
RxSwift封裝了定時器,該定時器并不會受到scrollView滑動的影響。它并不是對NSTimer的封裝。
func testTimer() {
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposeBag)
}
網(wǎng)絡(luò)請求
func testNextwork() {
let url = URL(string: "")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print(response)
})
.disposed(by: disposeBag)
}
從上述的例子可以看到,我們的對象在實例化之后都有rx這個屬性,那么這是為什么呢?其實這是因為在RxSwift中給NSObject實現(xiàn)了ReactiveCompatible協(xié)議,所以能獲取到rx這個屬性。
public protocol ReactiveCompatible {
/// Extended type
associatedtype CompatibleType
/// Reactive extensions.
static var rx: Reactive<CompatibleType>.Type { get set }
/// Reactive extensions.
var rx: Reactive<CompatibleType> { get set }
}
extension NSObject: ReactiveCompatible { }
使用RxSwift的必要性
swift是一門靜態(tài)語言,Objective-C的很多動態(tài)特性是無法使用的,而RxSwift則很好的彌補這個缺點??偨Y(jié)一下,RxSwift有以下優(yōu)點
- 簡單易用,大量的封裝了無關(guān)業(yè)務(wù)的實現(xiàn),讓程序員只關(guān)注自己想要的東西。比如說,使用
KVO,我們只需要關(guān)注被觀察者的變化,而不需要在意如何觀察、如何回調(diào)、何時移除觀察者。 - 復合性強,可以實現(xiàn)多事件的復合疊加、多控件中間的復合綁定
- 代碼的復?性比較高,能夠降低代碼量
- 代碼邏輯清晰,更好的分離不同層面的業(yè)務(wù);而且聲明都是不可變的,可讀性強
- 便于單元測試