RxSwift(1)-初識RxSwift

簡介

Rx簡介

RxSwiftRx家族對swift語言的封裝。什么是Rx呢?全稱是ReactiveX。官方對自己的定義如下:

An API for asynchronous programming with observable streams

一組帶有可觀察流的異步編程APIReactiveX結(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ā)送的時候,completederror只能出現(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ù);而且聲明都是不可變的,可讀性強
  • 便于單元測試
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 RxSwift顧名思義是Swift的一種框架,您或許曾經(jīng)聽說過「響應式編程」(Reactive Progra...
    Mr大喵喵閱讀 2,008評論 3 4
  • 本文章內(nèi)部分圖片資源來自RayWenderlich.com 本文結(jié)合自己的理解來總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 3,045評論 4 14
  • RxSwift 使用詳解系列 Rx Rx是ReactiveX的縮寫,簡單來說就是基于異步事件序列的響應式編程。Rx...
    內(nèi)心強大的Jim閱讀 989評論 0 0
  • 前言 寫這篇文章是為了記錄下自己在對于RxSwift的學習過程中的概念理解,操作步驟以及心得體會,以便于在以后復習...
    Henry_Jeannie閱讀 522評論 0 3
  • 今早沒跟嫻一起吃早餐,昨晚洗洗后11點多才睡,所以就睡個懶覺吧。 睡到9點的時候還是睡不下去了,起床。準備洗床單,...
    L林零閱讀 154評論 0 0

友情鏈接更多精彩內(nèi)容