函數(shù)響應式編程思想&RxSwift核心邏輯

一、函數(shù)響應式編程思想

(一)概念

這里借用百度百科的官方定義

函數(shù)式編程是種編程方式,它將電腦運算視為函數(shù)的計算。函數(shù)編程語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函數(shù)可以接受函數(shù)當作輸入(參數(shù))和輸出(返回值)。

簡言之,即將一個函數(shù)作為另一個函數(shù)的輸入或者輸出參數(shù)

(二)示例

當我們使用函數(shù)時,一般使用形如y = f(x)的結(jié)構(gòu),x為自變量,y為因變量。

函數(shù)式是將x轉(zhuǎn)化為一個函數(shù)f(x),那么就形成了如下的表達式

y = f(f(x))

f(x)為自變量,y為因變量

(三)與其他編程方式的差異

  • 和指令式編程相比,函數(shù)式編程強調(diào)函數(shù)的計算比指令的執(zhí)行重要。

  • 和過程化編程相比,函數(shù)式編程里函數(shù)的計算可隨時調(diào)用。

二、RxSwift核心邏輯

(一)RxSwift介紹

RxSwift 是 ReactiveX 家族的重要一員, ReactiveX 是 Reactive Extensions 的縮寫,一般簡寫為Rx。

ReactiveX 官方給Rx的定義是,Rx是一個使用可觀察數(shù)據(jù)流進行異步編程的編程接口。

ReactiveX 不僅僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。它拓展了觀察者模式,使你能夠自由組合多個異步事件,而不需要去關(guān)心線程,同步,線程安全,并發(fā)數(shù)據(jù)以及I/O阻塞。

RxSwift 是 Rx 為 Swift 語言開發(fā)的一門函數(shù)響應式編程語言, 它可以代替iOS系統(tǒng)的 Target Action / 代理 / 閉包 / 通知 / KVO …..

同時還提供網(wǎng)絡、數(shù)據(jù)綁定、UI事件處理、UI的展示和更新、多線程……

(二)RxSwift優(yōu)勢

鑒于swift日漸增長的影響力,ios開發(fā)者不可避免的要學習和使用swift這門語言進行編程開發(fā)。而RxSwift對使用swift的幫助有如下幾點:

  • swift為值類型,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補swift的靈活性

  • RxSwift使得代碼復用性較強,減少代碼量

  • RxSwift因為聲明都是不可變更,增加代碼可讀性

  • RxSwift使得更易于理解業(yè)務代碼,抽象異步編程,統(tǒng)一代碼風格

  • RxSwift使得代碼更易于編寫集成單元測試,增加代碼穩(wěn)定性

(三)RxSwift使用

下面為不同業(yè)務場景下的RxSwift的使用demo


    //MARK: - RxSwift應用-網(wǎng)絡請求

    func setupNextwork() {

        let url = URL(string: "https://www.baidu.com")

        URLSession.shared.rx.response(request: URLRequest(url: url!))

            .subscribe(onNext: { (response,data) in

                print(response)

        }).disposed(by: disposeBag)

    }



    //MARK: - RxSwift應用-timer定時器

    func setupTimer() {

        timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)

        timer.subscribe(onNext: { (num) in

            print(num)

        })

        .disposed(by: disposeBag)

    }



    //MARK: - 通知

    func setupNotification(){

        NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)

            .subscribe(onNext: { (noti) in

                print(noti)

            })

        .disposed(by: disposeBag)



    }



    //MARK: - 手勢

    func setupGestureRecognizer(){

        let tap = UITapGestureRecognizer()

        self.label.addGestureRecognizer(tap)

        self.label.isUserInteractionEnabled = true

        tap.rx.event.subscribe(onNext: { (tap) in

            print(tap.view)

        })

        .disposed(by: disposeBag)

    }



    //MARK: - RxSwift應用-scrollView

    func setupScrollerView() {

        scrollView.rx.contentOffset

            .subscribe(onNext: { [weak self](content) in

                self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)

            })

        .disposed(by: disposeBag)

    }



    //MARK: - RxSwift應用-textfiled

    func setupTextFiled() {

        self.textFiled.rx.text.orEmpty

            .subscribe(onNext: { (text) in

              print(text)

            })

            .disposed(by: disposeBag)

    }



    //MARK: - RxSwift應用-button響應

    func setupButton() {

        self.button.rx.tap

            .subscribe(onNext: { () in

                print("點擊來了")

            })

            .disposed(by: disposeBag)

    }



    //MARK: - RxSwift應用-KVO

    func setupKVO() {

        self.person.rx.observeWeakly(String.self, "name")

            .subscribe(onNext: { (value) in

                print(value as Any)

            })

            .disposed(by: disposeBag)

    }

(三)RxSwift核心邏輯

RxSwift核心流程如下

image

整個流程大致分為三步

  1. 創(chuàng)建序列create

  2. 訂閱序列subscribe

  3. 發(fā)送信號onNext

3.1 創(chuàng)建序列

  • 注意: 下面的代碼示例是經(jīng)過刪減的,只保留主要的方法邏輯

調(diào)用如下代碼創(chuàng)建私有類AnonymousObservable,保存外部的閉包為self._subscribeHandler


extension ObservableType {

    public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {

        return AnonymousObservable(subscribe)

    }

}

final private class AnonymousObservable<Element>: Producer<Element> {

    typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable

    let _subscribeHandler: SubscribeHandler

    init(_ subscribeHandler: @escaping SubscribeHandler) {

        self._subscribeHandler = subscribeHandler

    }



    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {

        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)

        let subscription = sink.run(self)

        return (sink: sink, subscription: subscription)

    }

}

final private class AnonymousObservableSink<O: ObserverType>: Sink<O>, ObserverType {

    func run(_ parent: Parent) -> Disposable {

        return parent._subscribeHandler(AnyObserver(self))

    }

}

  • 繼承關(guān)系如下 AnonymousObservable -> Producer -> Observable -> ObservableType

  • ObservableType協(xié)議中定義的subscribe方法由Producer實現(xiàn)


final private class AnonymousObservable<Element>: Producer<Element> {

}

class Producer<Element> : Observable<Element> {

    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {

        let sinkAndSubscription = self.run(observer, cancel: disposer)

    }

}

public class Observable<Element> : ObservableType {

}

public protocol ObservableType : ObservableConvertibleType {

    func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E

}

3.2 訂閱序列subscribe

  1. 調(diào)用subscribe創(chuàng)建 AnonymousObserver;

  2. AnonymousObserver保存外部的eventHandler;

  3. subscribe中的Disposables調(diào)用self.asObservable().subscribe(observer)時,走上面的AnonymousObservable調(diào)用父類Producer的subscribe實現(xiàn)流程


extension ObservableType {

        public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)

        -> Disposable {

            let observer = AnonymousObserver<E> { event in

                switch event {

                case .next(let value):

                    onNext?(value)

                case .error(let error):

                    if let onError = onError {

                        onError(error)

                    }

                    else {

                        Hooks.defaultErrorHandler(callStack, error)

                    }

                    disposable.dispose()

                case .completed:

                    onCompleted?()

                    disposable.dispose()

                }

            }

            return Disposables.create(

                self.asObservable().subscribe(observer),

                disposable

            )

    }

}

final class AnonymousObserver<ElementType> : ObserverBase<ElementType> {

    typealias Element = ElementType

    typealias EventHandler = (Event<Element>) -> Void

    private let _eventHandler : EventHandler



    init(_ eventHandler: @escaping EventHandler) {

        self._eventHandler = eventHandler

    }

    override func onCore(_ event: Event<Element>) {

        return self._eventHandler(event)

    }

}

3.3 發(fā)送信號onNext

  1. 調(diào)用ObserverType協(xié)議的OnNext,onNext調(diào)用子類ObserverBase的self.on;

  2. ObserverBase.on調(diào)用子類AnonymousObserver的self.onCore事件

  3. AnonymousObserver.onCore調(diào)用self._eventHandler,該事件即為創(chuàng)建AnonymousObserver時的訂閱事件

  • AnonymousObserver繼承關(guān)系如下

AnonymousObserver -> ObserverBase -> Disposable,ObserverType


extension ObserverType {

    public func onNext(_ element: E) {

        self.on(.next(element))

    }

}

class ObserverBase<ElementType> : Disposable, ObserverType {

    typealias E = ElementType

    func on(_ event: Event<E>) {

        switch event {

        case .next:

            self.onCore(event)

    }

    func onCore(_ event: Event<E>) {

        rxAbstractMethod()

    }

}

final class AnonymousObserver<ElementType> : ObserverBase<ElementType> {

    typealias Element = ElementType

    typealias EventHandler = (Event<Element>) -> Void

    private let _eventHandler : EventHandler



    init(_ eventHandler: @escaping EventHandler) {

        self._eventHandler = eventHandler

    }

    override func onCore(_ event: Event<Element>) {

        return self._eventHandler(event)

    }

}

至此,完整流程走完,里面還有很多細節(jié)需要細致分析,后面一篇將細致分析RxSwift流程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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