Swift - RxSwift的使用詳解61(sendMessage和methodInvoked的區(qū)別)

一延蟹、基本介紹

1,sendMessage 與 methodInvoked 的區(qū)別

(1)在之前的幾篇文章中叶堆,我用到了 methodInvoked 這個(gè) Rx 擴(kuò)展方法阱飘,其作用是獲取代理方法執(zhí)行后產(chǎn)生的數(shù)據(jù)流。

(2)除了 methodInvoked 外沥匈,還有個(gè) sentMessage 方法也有同樣的作用,它們間只有一個(gè)區(qū)別:

  • sentMessage 會(huì)在調(diào)用方法前發(fā)送值忘渔。
  • methodInvoked 會(huì)在調(diào)用方法后發(fā)送值高帖。

2,實(shí)現(xiàn)原理

(1)其原理簡(jiǎn)單說就是利用 Runtime 消息轉(zhuǎn)發(fā)機(jī)制來轉(zhuǎn)發(fā)代理方法畦粮。同時(shí)在調(diào)用返回值為空的代理方法的前后分別產(chǎn)生兩種數(shù)據(jù)流散址。

(2)比如最開始的代理為 A,然后我們把代理改為 AProxy宣赔,并把 A 設(shè)置為 AProxy_forwardToDelegate预麸。這樣所有的代理方法將會(huì)變成到達(dá) AProxy,接著 AProxy對(duì)這些方法進(jìn)行如下操作:

  • 首先調(diào)用 sentMessage 方法
  • 接著調(diào)用原代理方法
  • 最后調(diào)用 methodInvoked 方法

二儒将、使用樣例

我們分別通過 sendMessage 以及 methodInvoked 方法來獲取 selector 對(duì)應(yīng)的 Observable吏祸,并將它們與原方法做比較,看看執(zhí)行的先后順序钩蚊。

(注意:兩個(gè)樣例中 selector 都不是代理方法贡翘,但不影響效果的演示。)

樣例1:攔截 VC 的 viewWillAppear 方法

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //使用sentMessage方法獲取Observable
        self.rx.sentMessage(#selector(ViewController.viewWillAppear(_:)))
            .subscribe(onNext: { value in
                print("1")
            })
            .disposed(by: disposeBag)
         
        //使用methodInvoked方法獲取Observable
        self.rx.methodInvoked(#selector(ViewController.viewWillAppear(_:)))
            .subscribe(onNext: { value in
                print("3")
            })
            .disposed(by: disposeBag)
    }
     
    //默認(rèn)的viewWillAppear方法
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("2")
    }
}

運(yùn)行結(jié)果如下:

樣例2:攔截自定義方法

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //使用sentMessage獲取方法執(zhí)行前的序列
        self.rx.sentMessage(#selector(ViewController.test))
            .subscribe(onNext: { value in
                print("1:\(value[0])")
            })
            .disposed(by: disposeBag)
         
        //使用methodInvoked獲取方法執(zhí)行后的序列
        self.rx.methodInvoked(#selector(ViewController.test))
            .map({ (a) in
                return try castOrThrow(String.self, a[0])
            })
            .subscribe(onNext: { value in
                print("3:\(value)")
            })
            .disposed(by: disposeBag)
         
        //調(diào)用自定義方法
        test("hangge.com")
    }
     
    //自定義方法
    @objc dynamic func test(_ value:String) {
        print("2:\(value)")
    }
}
 
//轉(zhuǎn)類型的函數(shù)(轉(zhuǎn)換失敗后砰逻,會(huì)發(fā)出Error)
fileprivate func castOrThrow<T>(_ resultType: T.Type, _ object: Any) throws -> T {
    guard let returnValue = object as? T else {
        throw RxCocoaError.castingError(object: object, targetType: resultType)
    }
    return returnValue
}

運(yùn)行結(jié)果如下:

RxSwift使用詳解系列
原文出自:www.hangge.com轉(zhuǎn)載請(qǐng)保留原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸣驱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝠咆,更是在濱河造成了極大的恐慌丐巫,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺美,死亡現(xiàn)場(chǎng)離奇詭異递胧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赡茸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門缎脾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人占卧,你說我怎么就攤上這事遗菠×” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵辙纬,是天一觀的道長(zhǎng)豁遭。 經(jīng)常有香客問我,道長(zhǎng)贺拣,這世上最難降的妖魔是什么蓖谢? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮譬涡,結(jié)果婚禮上闪幽,老公的妹妹穿的比我還像新娘。我一直安慰自己涡匀,他們只是感情好盯腌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨瘩,像睡著了一般腕够。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舌劳,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天燕少,我揣著相機(jī)與錄音,去河邊找鬼蒿囤。 笑死客们,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的材诽。 我是一名探鬼主播底挫,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脸侥!你這毒婦竟也來了建邓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤睁枕,失蹤者是張志新(化名)和其女友劉穎官边,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外遇,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡注簿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跳仿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡渴。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菲语,靈堂內(nèi)的尸體忽然破棺而出妄辩,到底是詐尸還是另有隱情惑灵,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布眼耀,位于F島的核電站英支,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哮伟。R本人自食惡果不足惜干花,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澈吨。 院中可真熱鬧把敢,春花似錦寄摆、人聲如沸谅辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桑阶。三九已至,卻和暖如春勾邦,著一層夾襖步出監(jiān)牢的瞬間蚣录,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工眷篇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萎河,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓蕉饼,卻偏偏與公主長(zhǎng)得像虐杯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昧港,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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