<~ ReactiveSwift中的BindingSource && BindingTarget 源碼解析

在ReactiveSwift中,<~運(yùn)算符實(shí)現(xiàn)了數(shù)據(jù)源(Source)到數(shù)據(jù)目標(biāo)(Target)之間的綁定關(guān)系,實(shí)現(xiàn)了數(shù)據(jù)源的值發(fā)生變化時(shí),數(shù)據(jù)目標(biāo)同時(shí)得到更新暴浦,實(shí)際應(yīng)用一般是在UI控件的值隨與之綁定的ViewModel的值同步更新。

例如一個(gè)UILabel晓锻,綁定到ViewModel中的labelValue: MutableProperty

let label = UILabel()

label.reactive.text <~ viewModel.labelValue

之后歌焦,一旦ViewModel的labelValue值發(fā)生變化,則同步到視圖中的label進(jìn)行顯示砚哆,一次綁定独撇,終生享用,無需人工干預(yù)躁锁。

那么纷铣,這種綁定關(guān)系如何實(shí)現(xiàn)的,下面進(jìn)行源碼分析

從 <~的源碼開始分析入手:

image.png

<~函數(shù)在BindingTargetProvider協(xié)議中聲明战转,調(diào)用這個(gè)方法是由表達(dá)式左邊的對象作為Self發(fā)起的

BindingTarget <~ BindingSource
e.g. label.reactive.text <~ viewModel.labelValue

首先我們分析BindingTarget

image.png

image.png

BindingTarget主要包含一個(gè)(Value) -> Void 的action閉包搜立,在構(gòu)造的時(shí)候傳入action逃逸閉包

通過讓UILabel遵守ReactiveExtensionProvider協(xié)議,并擴(kuò)展Reactive where Base: UILabel方式槐秧,為UILabel增加Reactive擴(kuò)展屬性


image.png

image.png

image.png

image.png

makeBindingTarget { 0.text =1 } 實(shí)現(xiàn)了BindingTarget的self.base.text = value的賦值動(dòng)作啄踊,也是在<~運(yùn)算符中的provider.bindingTarget.action動(dòng)作,就是這里的賦值動(dòng)作刁标,至此颠通,BindingTarget這端的動(dòng)作及協(xié)議實(shí)現(xiàn)完成,下面來看BindingSource這邊需要完成的協(xié)議膀懈。

我們來實(shí)現(xiàn)一個(gè)簡單的AA類顿锰,讓這個(gè)類同時(shí)符合BindingTarget和BindingSource兩個(gè)協(xié)議的要求

image.png

AA類的實(shí)現(xiàn)點(diǎn):

  1. 在構(gòu)造時(shí),自身保存一對(signal, observer)

  2. 擴(kuò)展AA類遵守BindingSource協(xié)議启搂,聲明producer計(jì)算屬性硼控,在SignalProducer的startHandler中,調(diào)用自身的observer發(fā)送值消息胳赌,并將SignalProducer構(gòu)造的observer添加至自身signal中保存

  3. 擴(kuò)展AA類遵守BindingTarget協(xié)議牢撼,聲明tareget計(jì)算屬性,返回makeBindingTarget { $0.name = $1 }匈织,完成賦值動(dòng)作,這里多講一點(diǎn)的就是,makeBindingTarget是對BindingTarget的二次封裝缀匕,在BindingTarget構(gòu)造中纳决,action是(Value) -> Void類型,這里的makeBindingTarget傳參是(Base, Value) -> Void類型乡小,展開makeBindingTarget方法后阔加,可以看到它是怎么進(jìn)行二次封裝的,添加了Base屬性在其中满钟。

  4. 聲明changeValue(value: String)方法胜榔,在賦值過程中,調(diào)用一次自身的observer發(fā)送值消息湃番,這里的changeValue動(dòng)作類似MutableProperty對值類型的封裝過程夭织,并這里作了簡化便于理解原理,在MutableProperty的賦值過程中吠撮,是調(diào)用了內(nèi)部的Box對存儲(chǔ)的值進(jìn)行了一次封裝尊惰,并涉及到原子操作。


    image.png

調(diào)用AA.changeValue后泥兰,一次調(diào)用AA自身的observer.send -> AA.producer.observer.send -> provider.bindingTarget.action 最終完成賦值動(dòng)作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弄屡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鞋诗,更是在濱河造成了極大的恐慌膀捷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削彬,死亡現(xiàn)場離奇詭異全庸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吃警,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門糕篇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酌心,你說我怎么就攤上這事拌消。” “怎么了安券?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵墩崩,是天一觀的道長。 經(jīng)常有香客問我侯勉,道長鹦筹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任址貌,我火速辦了婚禮铐拐,結(jié)果婚禮上徘键,老公的妹妹穿的比我還像新娘。我一直安慰自己遍蟋,他們只是感情好吹害,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虚青,像睡著了一般它呀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棒厘,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天纵穿,我揣著相機(jī)與錄音,去河邊找鬼奢人。 笑死谓媒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的达传。 我是一名探鬼主播篙耗,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宪赶!你這毒婦竟也來了宗弯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搂妻,失蹤者是張志新(化名)和其女友劉穎蒙保,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欲主,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓厕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扁瓢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片详恼。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖引几,靈堂內(nèi)的尸體忽然破棺而出昧互,到底是詐尸還是另有隱情,我是刑警寧澤伟桅,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布敞掘,位于F島的核電站,受9級特大地震影響楣铁,放射性物質(zhì)發(fā)生泄漏玖雁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一盖腕、第九天 我趴在偏房一處隱蔽的房頂上張望赫冬。 院中可真熱鬧浓镜,春花似錦、人聲如沸劲厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脊僚。三九已至,卻和暖如春遵绰,著一層夾襖步出監(jiān)牢的瞬間辽幌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工椿访, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乌企,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓成玫,卻偏偏與公主長得像加酵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子哭当,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,386評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 有人從現(xiàn)實(shí)中找領(lǐng)悟猪腕,有人從劇集中找生活的本真。抽風(fēng)挖出陳浩民跟佘詩曼的老片《帶我飛帶我走》钦勘,劇情真的很好詮釋了什么...
    李莫愁是我閱讀 126評論 0 0
  • 圖文/巴山雨 轉(zhuǎn)載請聯(lián)系作者授權(quán) 每天手繪一張圓形禪繞畫陋葡,第100天會(huì)怎樣?喜歡就來關(guān)注雨姐姐的專題我真的來畫畫彻采,...
    巴山雨閱讀 944評論 0 1
  • 簡介 通俗的稱為寫時(shí)拷貝的一種機(jī)制腐缤,也就是說讀的時(shí)候并不需要拷貝 應(yīng)用場景 并發(fā)線程中對同一塊資源同時(shí)處理數(shù)據(jù)錯(cuò)亂...
    螞蟻牙齒不黑閱讀 1,728評論 1 0