RAC(ReactiveCocoa)介紹(一)——基本介紹

?最近接觸學(xué)習(xí)到了RAC(ReactiveCocoa),RAC是函數(shù)式+響應(yīng)式編程結(jié)合乃正,首先得去理解何為響應(yīng)式函數(shù)編程(FRP)瓮具。

? ? 看了許多介紹,舉一個(gè)最通俗易懂的例子——在命令式編程環(huán)境中兑巾, a = b+c表示將表達(dá)式的結(jié)果賦給 a,而之后改變 b 或 c的值不會(huì)影響 a忠荞。但在響應(yīng)式編程中蒋歌,a的值會(huì)隨著 b或 c的更新而更新帅掘,意味著聲明了一種綁定關(guān)系,b堂油、c的變化會(huì)直接影響到a修档。

? ? 之前在iOS工作中,類之間的傳值府框,無非就是block吱窝、delegate代理、KVO迫靖、notification這幾種方法。在RAC中,同樣具備替代KVO、delegate代理口柳、通知俺孙、UI target场靴、計(jì)時(shí)器timer轨帜、數(shù)據(jù)結(jié)構(gòu)等各種方法苟弛。依據(jù)響應(yīng)式函數(shù)編程,RAC方法本身更加簡潔明了,通過提供信號(hào)的方式(RACSignal)可以捕捉當(dāng)前以及未來的屬性值變化,而且無需持續(xù)觀察和更新代碼劝篷。可直接在block中將邏輯代碼加入其中,使得代碼緊湊,更加直觀。

? ? 先來介紹ObjC版本兼贡,使用cocoaPods在podfile中添加 pod 'ReactiveObjC', '~> 3.1.0' 涉兽,然后pod install一下拥诡。在項(xiàng)目中#import <ReactiveObjC.h>,建議放入pch頭文件中乌奇。

? ? 通過RAC提供的方法與系統(tǒng)提供的方法分別進(jìn)行對(duì)比,先來感受下RAC的強(qiáng)大之處。

1. UIButton

通過默認(rèn)的Target-action創(chuàng)建點(diǎn)擊動(dòng)作
RAC創(chuàng)建Button點(diǎn)擊事件與添加點(diǎn)擊手勢(shì)動(dòng)作


在RAC的block代碼塊中,打印x的屬性為當(dāng)前self.testButton的相關(guān)信息。


2. KVO

KVO在使用時(shí),必須在- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context中實(shí)現(xiàn)針對(duì)KVO監(jiān)聽屬性值變化的處理浦译,而且對(duì)于KeyPath書寫容易產(chǎn)生手寫錯(cuò)誤。在對(duì)應(yīng)類dealloc時(shí),KVO還必須要進(jìn)行remove操作籽前,否則會(huì)程序crash

使用KVO監(jiān)聽UILable的text屬性變化

在使用RAC代替KVO時(shí)蓖宦,不僅能大大增加代碼可讀性电爹,而且RACObserve(<#TARGET#>, <#KEYPATH#>)宏定義中keyPath可以代碼提示出target中的屬性成員變量法梯,降低手寫代碼錯(cuò)誤的可能性铛绰。

使用RAC代替KVO監(jiān)聽屬性變化

3. delegate代理

以UITextField為例,當(dāng)需要對(duì)UITextField邏輯處理時(shí),往往需要實(shí)現(xiàn)其各類代理方法,大大增加了代碼量唯蝶。當(dāng)使用RAC之后

使用RAC代替delegate實(shí)現(xiàn)方法

@selector方法選擇器中鍵入要實(shí)現(xiàn)的代理方法,代理名稱聲明為對(duì)應(yīng)的代理名稱。block代碼塊中,當(dāng)觸發(fā)監(jiān)聽的代理方法時(shí)返回元組類型數(shù)據(jù)填渠,與swift中的元組類型有所區(qū)別屉更,此處的元組看起來更像是數(shù)組徙融。

打印結(jié)果

4. Notification通知

RAC通知使用
RAC會(huì)將通知名以及userInfo相關(guān)信息返回至block中

5. 定時(shí)器timer

6. 數(shù)組與字典

遍歷元素

RAC遍歷字典、數(shù)組中的元素

RAC基本使用方法與流程

RAC基本使用方法與流程

????以上代碼中瑰谜,subscribeNext作用為訂閱信號(hào)欺冀,可在該block中輸入邏輯相關(guān)代碼塊。但當(dāng)多個(gè)對(duì)象的邏輯存在于block中需要修改時(shí)萨脑,僅僅subscribeNext已不能滿足需求隐轩。

RAC中信號(hào)的其它動(dòng)作:

信號(hào)映射:map、flattenMap

信號(hào)過濾:filter渤早、ignore职车、distinctUntilChanged

信號(hào)合并:combineLatest、reduce、merge悴灵、zipWith

信號(hào)連接:concat扛芽、then

信號(hào)操作時(shí)間:timeout、interval积瞒、dely

信號(hào)跳過:skip

信號(hào)取值:take川尖、takeLast、takeUntil

信號(hào)發(fā)送順序:donext茫孔、cocompleted

獲取信號(hào)中的信號(hào):switchToLatest

信號(hào)錯(cuò)誤重試:retry

? ? 在實(shí)際開發(fā)過程中叮喳,需要在RAC代碼塊中添加邏輯代碼,避免不了引用當(dāng)前類中的成員變量缰贝,那么需要在RAC方法外部寫入以下代碼:

@weakify(self)

? ? 在RAC的block代碼塊內(nèi)部寫入:

@strongify(self)

以此來避免出現(xiàn)block的循環(huán)引用馍悟,至于為何要如此聲明,稍后會(huì)在后續(xù)文章中一一說明揩瞪。


????稍后會(huì)在后續(xù)的文章里繼續(xù)介紹如何使用赋朦,以及RAC信號(hào)流程原理。demo代碼放到GitHub上demo鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末李破,一起剝皮案震驚了整個(gè)濱河市宠哄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤攻,老刑警劉巖毛嫉,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妇菱,居然都是意外死亡承粤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門闯团,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛臊,“玉大人,你說我怎么就攤上這事房交〕菇ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵候味,是天一觀的道長刃唤。 經(jīng)常有香客問我,道長白群,這世上最難降的妖魔是什么尚胞? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮帜慢,結(jié)果婚禮上笼裳,老公的妹妹穿的比我還像新娘唯卖。我一直安慰自己,他們只是感情好侍咱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布耐床。 她就那樣靜靜地躺著,像睡著了一般楔脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胯甩,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天昧廷,我揣著相機(jī)與錄音,去河邊找鬼偎箫。 笑死木柬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淹办。 我是一名探鬼主播眉枕,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼怜森!你這毒婦竟也來了速挑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤副硅,失蹤者是張志新(化名)和其女友劉穎姥宝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恐疲,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腊满,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了培己。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碳蛋。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖省咨,靈堂內(nèi)的尸體忽然破棺而出肃弟,到底是詐尸還是另有隱情,我是刑警寧澤茸炒,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布愕乎,位于F島的核電站,受9級(jí)特大地震影響壁公,放射性物質(zhì)發(fā)生泄漏感论。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一紊册、第九天 我趴在偏房一處隱蔽的房頂上張望比肄。 院中可真熱鬧快耿,春花似錦、人聲如沸芳绩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妥色。三九已至搪花,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘹害,已是汗流浹背撮竿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笔呀,地道東北人幢踏。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像许师,于是被迫代替她去往敵國和親房蝉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個(gè)應(yīng)用于i...
    F麥子閱讀 635評(píng)論 0 0
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個(gè)應(yīng)用于i...
    清蘂翅膀的技術(shù)閱讀 1,975評(píng)論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個(gè)應(yīng)用于i...
    愛睡覺的魚閱讀 1,141評(píng)論 0 1
  • ReactiveCocoa函數(shù)響應(yīng)式編程:FRP 參考文獻(xiàn):http://www.cnblogs.com/taox...
    _Weak閱讀 456評(píng)論 0 0