RXSwift 初次探索

RXSwift的最初探索

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

rxswift 的使用方式

例如 我們常見使用的觀察者模式:在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)擊來了")
        })
                   .disposed(by: disposeBag)    
         
//            

此時(shí),會(huì)有疑惑拷邢,為什么多個(gè)對(duì)象都是擁有rx這個(gè)屬性的。 這個(gè)就需要進(jìn)入到rx 的里面去查詢
以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)類型作為協(xié)議定義的一部分將會(huì)非常有用瞭稼。關(guān)聯(lián)類型為協(xié)議中的某個(gè)類型提供了一個(gè)占位名(或者說別名),其代表的實(shí)際類型在協(xié)議被采納時(shí)才會(huì)被指定腻惠。
在這里环肘,因?yàn)樽髡唛_發(fā)大多是用于oc 對(duì)iOS APP的開發(fā),對(duì)于oc開發(fā)者來說集灌,associatedtype類似于擴(kuò)展和類別悔雹,實(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 { }
//萬物皆對(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("銷毀")
        }
       

這里 是對(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)聽 然后 通過selector 去執(zhí)行了onNext 方法發(fā)送信號(hào)呢闲询?

繼續(xù)...

  public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
       return AnonymousObservable(subscribe)
   }
   返回一個(gè)匿名的內(nè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 的初始化,但是并沒有對(duì)應(yīng)上Observable的obserber
點(diǎn)擊asObservable() 發(fā)現(xiàn)返回的就是ob對(duì)象臼隔,并且 我們從Observable 中 并沒有發(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è)交給了子類去實(shí)現(xiàn) run 方法
然后子類實(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

也就是說 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)了 睡覺 有問題的 大家?guī)臀艺蚁?我好糾正我的觀點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寄狼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泊愧,老刑警劉巖伊磺,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異删咱,居然都是意外死亡屑埋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門痰滋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摘能,“玉大人,你說我怎么就攤上這事敲街⊥鸥悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵多艇,是天一觀的道長逻恐。 經(jīng)常有香客問我,道長峻黍,這世上最難降的妖魔是什么复隆? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮姆涩,結(jié)果婚禮上挽拂,老公的妹妹穿的比我還像新娘。我一直安慰自己阵面,他們只是感情好轻局,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著样刷,像睡著了一般仑扑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上置鼻,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天镇饮,我揣著相機(jī)與錄音,去河邊找鬼箕母。 笑死储藐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘶是。 我是一名探鬼主播钙勃,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼聂喇!你這毒婦竟也來了辖源?” 一聲冷哼從身側(cè)響起蔚携,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎克饶,沒想到半個(gè)月后酝蜒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矾湃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年亡脑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邀跃。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霉咨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坞嘀,到底是詐尸還是另有隱情躯护,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布丽涩,位于F島的核電站,受9級(jí)特大地震影響裁蚁,放射性物質(zhì)發(fā)生泄漏矢渊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一枉证、第九天 我趴在偏房一處隱蔽的房頂上張望矮男。 院中可真熱鬧,春花似錦室谚、人聲如沸毡鉴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猪瞬。三九已至,卻和暖如春入篮,著一層夾襖步出監(jiān)牢的瞬間陈瘦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工潮售, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痊项,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓酥诽,卻偏偏與公主長得像鞍泉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肮帐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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