RXSwift 初次探索

RXSwift的最初探索

iOS 中 我們常用到的函數(shù)式編程 oc中的RAC 和 swift中的RXSwift 是非常有影響力的,最近也是嘗試著查看RXSwift的相關(guān)信息,今天就從rxswif 入手:

rxswift 的使用方式

例如 我們常見(jiàn)使用的觀察者模式:在swift 中的使用方式是:

self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)   
//然后 實(shí)現(xiàn)代理

  override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
     print("響應(yīng)")
     print(change as Any)
 }

 deinit {
    self.removeObserver(self.person, forKeyPath: "name", context: nil)
        }

這樣去執(zhí)行 并且去觀察 對(duì)象的輸出變化
但是在rxswift 中 的代碼塊是這樣子的

 self.person.rx.observeWeakly(String.self, "name")
         .subscribe(onNext: { (value) in
             print(value as Any)
         })
         .disposed(by: disposeBag)

這樣 能實(shí)現(xiàn)以上觀察者模式相同的代碼內(nèi)容,完成業(yè)務(wù)需求。同理,我們可以執(zhí)行一些其他的對(duì)象rx的使用方式:

// UItextFiled:
   self.textFiled.rx.text.orEmpty
         .subscribe(onNext: { (text) in
            print(text)
         })
         .disposed(by: disposeBag)
//UIButton:的使用方式    
     self.button.rx.tap
         .subscribe(onNext: { () in
            print("點(diǎn)擊來(lái)了")
        })
                   .disposed(by: disposeBag)    
         
//            

此時(shí),會(huì)有疑惑,為什么多個(gè)對(duì)象都是擁有rx這個(gè)屬性的。 這個(gè)就需要進(jìn)入到rx 的里面去查詢(xún)
以button為例子:

 associatedtype CompatibleType

   /// Reactive extensions.
   static var rx: Reactive<CompatibleType>.Type { get set }

   /// Reactive extensions.
   var rx: Reactive<CompatibleType> { get set }

associatedtype 拓展

定義一個(gè)協(xié)議時(shí),有的時(shí)候聲明一個(gè)或多個(gè)關(guān)聯(lián)類(lèi)型作為協(xié)議定義的一部分將會(huì)非常有用。關(guān)聯(lián)類(lèi)型為協(xié)議中的某個(gè)類(lèi)型提供了一個(gè)占位名(或者說(shuō)別名),其代表的實(shí)際類(lèi)型在協(xié)議被采納時(shí)才會(huì)被指定。
在這里,因?yàn)樽髡唛_(kāi)發(fā)大多是用于oc 對(duì)iOS APP的開(kāi)發(fā),對(duì)于oc開(kāi)發(fā)者來(lái)說(shuō),associatedtype類(lèi)似于擴(kuò)展和類(lèi)別,實(shí)現(xiàn)這個(gè)的方法。 ok 我們繼續(xù)下去

在所有的對(duì)象文件rx 文件中,我們能看到public protocol ReactiveCompatible,那么 我們就能能理解為,rxswift 在對(duì)每個(gè)對(duì)象,做到了協(xié)議 然后關(guān)聯(lián)到了對(duì)象上面,那么rxswift 是怎么去關(guān)聯(lián)的呢?

extension NSObject: ReactiveCompatible { }
//萬(wàn)物皆對(duì)象啊 兄弟們 /// 打個(gè)666

然后講講Observable

 let ob = Observable<Any>.create { (obserber) -> Disposable in
            發(fā)送信號(hào)
            obserber.onNext("")
            obserber.onCompleted()
            obserber.onError(NSError.init(domain: "error info ", code: 8888, userInfo: nil))
            return Disposables.create()
        }

這個(gè)地方是對(duì)創(chuàng)建的信號(hào)序列 的創(chuàng)建 以及信息的發(fā)送,

   let _ = ob.subscribe(onNext: { (text) in
            print("\(text)")
        }, onError: { (error) in
            print("error: \(error)")
        }, onCompleted: {
            print("完成")
        }) {
            print("銷(xiāo)毀")
        }
       

這里 是對(duì)信息的接收 那么 rx 內(nèi)部的實(shí)現(xiàn) 就是對(duì)序列 信號(hào)的響應(yīng)
在這里 可以思考下 為什么 UI層能夠被rx 所捕捉到呢?
思考:

@available(iOS 2.0, *)
open class UIControl : UIView {

   // add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
   // passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order
   // the action cannot be NULL. Note that the target is not retained.
   open func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event)



點(diǎn)擊controller 不難發(fā)現(xiàn) 我們看到了 addTarget
在此 是否可以理解為 rx內(nèi)部的實(shí)現(xiàn) 是否是有對(duì)addTarget的監(jiān)聽(tīng) 然后 通過(guò)selector 去執(zhí)行了onNext 方法發(fā)送信號(hào)呢?

繼續(xù)...

  public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
       return AnonymousObservable(subscribe)
   }
   返回一個(gè)匿名的內(nèi)部類(lèi)
   
   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)
   }
}
這個(gè)匿名函數(shù)是繼承于Producer 的 并且 typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable

   let _subscribeHandler: SubscribeHandle

對(duì)這個(gè)閉包 做了保存處理

那么 繼續(xù)看subscribe

內(nèi)容里面 我們看到
let observer = AnonymousObserver<E>
是對(duì)observer 的初始化,但是并沒(méi)有對(duì)應(yīng)上Observable的obserber
點(diǎn)擊asObservable() 發(fā)現(xiàn)返回的就是ob對(duì)象,并且 我們從Observable 中 并沒(méi)有發(fā)現(xiàn)subscribe 的方法,那么繼續(xù) 我們根據(jù)之前的AnonymousObservable 這個(gè)匿名函數(shù) 點(diǎn)擊進(jìn)去發(fā)現(xiàn)了 繼承與Producer

在點(diǎn)擊進(jìn)去之后 有個(gè) override func subscribe 的方法,這個(gè)里面

  let sinkAndSubscription = self.run(observer, cancel: disposer)
                disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
                
     func run(_ parent: Parent) -> Disposable {
        return parent._subscribeHandler(AnyObserver(self))
    }
                

是將這個(gè)交給了子類(lèi)去實(shí)現(xiàn) run 方法
然后子類(lèi)實(shí)現(xiàn)就是把之前保存的
typealias Parent = AnonymousObservable<E> parent._subscribeHandler(AnyObserver(self)) 當(dāng)前保存的閉包 提交了出去 ,那么 看到的

  return Disposables.create(
              self.asObservable().subscribe(observer),
              disposable
          )

將我們之前ob 創(chuàng)建的對(duì)象內(nèi)容提交到了 subscribe

也就是說(shuō) obserber.onNext("我就玩玩")
發(fā)送后 subscribe里面的

 let observer = AnonymousObserver<E> { event in
               
               #if DEBUG
                   synchronizationTracker.register(synchronizationErrorMessage: .default)
                   defer { synchronizationTracker.unregister() }
               #endif
               
               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()
               }
           }

就捕捉到了信號(hào) 然后根據(jù)閉包 返回到了 我們所需要的onnet 接收器內(nèi)

目前 這就是我所理解的信號(hào) 0點(diǎn)了 睡覺(jué) 有問(wèn)題的 大家?guī)臀艺蚁?我好糾正我的觀點(diǎn)

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

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

  • 本文章內(nèi)部分圖片資源來(lái)自RayWenderlich.com 本文結(jié)合自己的理解來(lái)總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 3,043評(píng)論 4 14
  • 最近在學(xué)習(xí)RxSwift相關(guān)的內(nèi)容,在這里記錄一些基本的知識(shí)點(diǎn),以便今后查閱。 Observable 在RxSwi...
    L_Zephyr閱讀 1,897評(píng)論 1 4
  • 概述 RxSwift顧名思義是Swift的一種框架,您或許曾經(jīng)聽(tīng)說(shuō)過(guò)「響應(yīng)式編程」(Reactive Progra...
    Mr大喵喵閱讀 2,003評(píng)論 3 4
  • 響應(yīng)式編程&鏈?zhǔn)骄幊?公司的幾個(gè)共享項(xiàng)目, 有較多后臺(tái)定時(shí)的網(wǎng)絡(luò)請(qǐng)求,定位和藍(lán)牙操作的組合. 原方案是通過(guò)閉包嵌套...
    奧利奧_2aff閱讀 8,949評(píng)論 2 32
  • 也許,我們生活中,都會(huì)碰到過(guò)朋友向你借錢(qián)的經(jīng)歷吧。其實(shí),在自己能力允許的情況下,借錢(qián)給身邊需要幫助的人,也是一...
    orget閱讀 1,044評(píng)論 0 1

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