**推薦:ReactiveCocoa和MVVM專題,匯聚一些優(yōu)秀相關(guān)博客 **
ReactiveCocoa為事件定義了一個(gè)標(biāo)準(zhǔn)接口细办,從而可以使用一些基本工具來(lái)更容易的連接、過(guò)濾和組合咐扭。如果你對(duì)上面說(shuō)的還比較疑惑,那還是繼續(xù)往下看吧。
一 )函數(shù)響應(yīng)式編程名稱的由來(lái)
ReactiveCocoa結(jié)合了幾種編程風(fēng)格:
- 函數(shù)式編程(Functional Programming):使用高階函數(shù),例如函數(shù)用其他函數(shù)作為參數(shù).
- 響應(yīng)式編程(Reactive Programming):關(guān)注于數(shù)據(jù)流和變化傳播鹃觉。
所以,你可能聽說(shuō)過(guò)ReactiveCocoa被描述為函數(shù)響應(yīng)式編程(FRP)框架睹逃。
二 )ReactiveCocoa作用
在我們iOS開發(fā)過(guò)程中盗扇,當(dāng)某些事件響應(yīng)的時(shí)候,需要處理某些業(yè)務(wù)邏輯,這些事件都用不同的方式來(lái)處理唯卖。比如按鈕的點(diǎn)擊使用action粱玲,ScrollView滾動(dòng)使用delegate,屬性值改變使用KVO等系統(tǒng)提供的方式拜轨。其實(shí)這些事件抽减,都可以通過(guò)RAC處理ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便橄碾,可以把要處理的事情卵沉,和監(jiān)聽的事情的代碼放在一起,這樣非常方便我們管理法牲,就不需要跳到對(duì)應(yīng)的方法里史汗。非常符合我們開發(fā)中高聚合,低耦合的思想拒垃。
三) 信號(hào)的邏輯圖
核心概念是RACSignal停撞,相當(dāng)于一個(gè)信號(hào)管道,接收信號(hào)源的信號(hào),將信號(hào)依次發(fā)送給
四 ) RAC 和MVVM 結(jié)合使用圖
五 RAC 簡(jiǎn)單實(shí)用二十例
ReactiveCocoa簡(jiǎn)單使用20例 超級(jí)值得一看和嘗試
六 ) ReactiveCocoa常見(jiàn)類戈毒。
學(xué)習(xí)框架首要之處:個(gè)人認(rèn)為先要搞清楚框架中常用的類艰猬,在RAC中最核心的類RACSiganl,搞定這個(gè)類就能ReactiveCocoa開發(fā)了。
6.1RACSiganl
信號(hào)類,一般表示將來(lái)有數(shù)據(jù)傳遞埋市,只要有數(shù)據(jù)改變冠桃,信號(hào)內(nèi)部接收到數(shù)據(jù),就會(huì)馬上發(fā)出數(shù)據(jù)道宅。注意信號(hào)類(RACSiganl)食听,只是表示當(dāng)數(shù)據(jù)改變時(shí),信號(hào)內(nèi)部會(huì)發(fā)出數(shù)據(jù)污茵,它本身不具備發(fā)送信號(hào)的能力樱报,而是交給內(nèi)部一個(gè)訂閱者去發(fā)出。
默認(rèn)一個(gè)信號(hào)都是冷信號(hào)省咨,也就是值改變了肃弟,也不會(huì)觸發(fā),只有訂閱了這個(gè)信號(hào)零蓉,這個(gè)信號(hào)才會(huì)變?yōu)?strong>熱信號(hào)笤受,值改變了才會(huì)觸發(fā)。
如何訂閱信號(hào):調(diào)用信號(hào)RACSignal的subscribeNext
就能訂閱敌蜂。
6.2RACSubscriber
:表示訂閱者的意思箩兽,用于發(fā)送信號(hào),這是一個(gè)協(xié)議章喉,不是一個(gè)類汗贫,只要遵守這個(gè)協(xié)議,并且實(shí)現(xiàn)方法才能成為訂閱者秸脱。通過(guò)create創(chuàng)建的信號(hào)落包,都有一個(gè)訂閱者,幫助他發(fā)送數(shù)據(jù)摊唇。
6.3RACDisposable
用于取消訂閱或者清理資源咐蝇,當(dāng)信號(hào)發(fā)送完成或者發(fā)送錯(cuò)誤的時(shí)候,就會(huì)自動(dòng)觸發(fā)它巷查。
使用場(chǎng)景
:不想監(jiān)聽某個(gè)信號(hào)時(shí)有序,可以通過(guò)它主動(dòng)取消訂閱信號(hào)。
6.4RACSubject
:RACSubject:信號(hào)提供者岛请,自己可以充當(dāng)信號(hào)旭寿,又能發(fā)送信號(hào)。
6.6RACTuple
元組類,類似NSArray,用來(lái)包裝值.
6.7RACSequence
:RAC中的集合類崇败,用于代替NSArray,NSDictionary,可以使用它來(lái)快速遍歷數(shù)組和字典盅称。
6.8RACCommand
RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞,包裝到這個(gè)類中缩膝,他可以很方便的監(jiān)控事件的執(zhí)行過(guò)程搭幻。
使用場(chǎng)景
監(jiān)聽按鈕點(diǎn)擊,網(wǎng)絡(luò)請(qǐng)求
6.9RACMulticastConnection
用于當(dāng)一個(gè)信號(hào)逞盆,被多次訂閱時(shí),為了保證創(chuàng)建信號(hào)時(shí)松申,避免多次調(diào)用創(chuàng)建信號(hào)中的block云芦,造成副作用,可以使用這個(gè)類處理贸桶。
6.10 RACScheduler
RAC中的隊(duì)列舅逸,用GCD封裝的。
6.11 RACUnit
表?stream不包含有意義的值,也就是看到這個(gè)皇筛,可以直接理解為nil.
6.12RACEvent
把數(shù)據(jù)包裝成信號(hào)事件(signal event)琉历。它主要通過(guò)RACSignal的-materialize來(lái)使用,然并卵水醋。
七).ReactiveCocoa開發(fā)中常見(jiàn)用法旗笔。
7.1 代替代理:
rac_signalForSelector 用于替代代理。
7.2 代替KVO :
rac_valuesAndChangesForKeyPath 用于監(jiān)聽某個(gè)對(duì)象的屬性改變拄踪。
7.3 監(jiān)聽事件:
rac_signalForControlEvents 用于監(jiān)聽某個(gè)事件蝇恶。
7.4 代替通知:
rac_addObserverForName 用于監(jiān)聽某個(gè)通知。
7.5 監(jiān)聽文本框文字改變:
rac_textSignal 只要文本框發(fā)出改變就會(huì)發(fā)出這個(gè)信號(hào)惶桐。
7.6 處理當(dāng)界面有多次請(qǐng)求時(shí)撮弧,需要都獲取到數(shù)據(jù)時(shí),才能展示界面
八).ReactiveCocoa常見(jiàn)宏姚糊。
8.1RAC
(TARGET, [KEYPATH, [NIL_VALUE]])用于給某個(gè)對(duì)象的某個(gè)屬性綁定贿衍。// 只要文本框文字改變,就會(huì)修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal;
8.2RACObserve(self, name)
:監(jiān)聽某個(gè)對(duì)象的某個(gè)屬性,返回的是信號(hào)救恨。
[RACObserve(self.view, center) subscribeNext:^(id x) { NSLog(@"%@",x); }];
8.3@weakify(Obj)和@strongify(Obj)
,一般兩個(gè)都是配套使用,在主頭文件(ReactiveCocoa.h
)中并沒(méi)有導(dǎo)入贸辈,需要自己手動(dòng)導(dǎo)入,RACEXTScope.h
才可以使用忿薇。但是每次導(dǎo)入都非常麻煩裙椭,只需要在主頭文件自己導(dǎo)入就好了。
8.4RACTuplePack
:把數(shù)據(jù)包裝成RACTuple(元組類)
// 把參數(shù)中的數(shù)據(jù)包裝成元組 RACTuple *tuple = RACTuplePack(@10,@20);
8.5RACTupleUnpack
:把RACTuple(元組類)解包成對(duì)應(yīng)的數(shù)據(jù)署浩。
// 把參數(shù)中的數(shù)據(jù)包裝成元組 RACTuple *tuple = RACTuplePack(@"xmg",@20); // 解包元組揉燃,會(huì)把元組的值,按順序給參數(shù)里面的變量賦值 // name = @"xmg" age = @20 RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
參考資料
ReactiveCocoa之基礎(chǔ)篇
ReactiveCocoa之進(jìn)階篇
函數(shù)響應(yīng)式編程
- 作者開發(fā)經(jīng)驗(yàn)總結(jié)的文章推薦,持續(xù)更新學(xué)習(xí)心得筆記
Runtime 10種用法(沒(méi)有比這更全的了)
成為iOS頂尖高手筋栋,你必須來(lái)這里(這里有最好的開源項(xiàng)目和文章)
iOS逆向Reveal查看任意app 的界面
JSPatch (實(shí)時(shí)修復(fù)App Store bug)學(xué)習(xí)(一)
iOS 高級(jí)工程師是怎么進(jìn)階的(補(bǔ)充版20+點(diǎn))
擴(kuò)大按鈕(UIButton)點(diǎn)擊范圍(隨意方向擴(kuò)展哦)
最簡(jiǎn)單的免證書真機(jī)調(diào)試(原創(chuàng))
通過(guò)分析微信app,學(xué)學(xué)如何使用@2x,@3x圖片
TableView之MVVM與MVC之對(duì)比
使用MVVM減少控制器代碼實(shí)戰(zhàn)(減少56%)
ReactiveCocoa添加cocoapods 配置圖文教程及坑總結(jié)