最近看到好多人用到RAC,就簡(jiǎn)單的看了一些別的大神文章,寫出來了一點(diǎn)
什么是RAC痕慢?
幾乎每一篇介紹RAC的文章開頭都是這么一個(gè)問題刘急。我這篇文章是寫給新手(包括我自己)看的奕扣,所以這個(gè)問題更是無法忽視丙挽。
簡(jiǎn)單的說令杈,RAC就是一個(gè)第三方庫(kù)走敌,他可以大大簡(jiǎn)化你的代碼過程。
官方的說逗噩,ReactiveCocoa(其簡(jiǎn)稱為RAC)是由GitHub開源的一個(gè)應(yīng)用于iOS和OS X開發(fā)的新框架掉丽。RAC具有函數(shù)式編程和響應(yīng)式編程的特性。
為什么我們要學(xué)習(xí)RAC异雁?
為了提高我們的開發(fā)效率捶障。RAC在某些特定情況下開發(fā)時(shí)可以大大簡(jiǎn)化代碼,并且目前來看安全可靠纲刀。
配置RAC環(huán)境
platform:ios,'8.0'pod'ReactiveCocoa','~>2.1.8'
這里有一點(diǎn)要注意下就是RAC的版本問題项炼,由于還沒學(xué)習(xí)Swift,所以我是用OC編寫程序的,最新版的RAC已經(jīng)支持Swift了锭部,但是在OC的
程序安裝最新版的RAC可能跑不起來驱闷,所以推薦大家使用2.5.0版本以下的RAC(具體支持Swift的版本可能有誤,但我引用的2.1.8肯定是沒問
題的)空免。
使用RAC
1.target-action
RAC最基本的入門使用技巧就是對(duì)事件的監(jiān)聽。
PS:在iOS開發(fā)中盆耽,我們所說的點(diǎn)擊事件其實(shí)就是target-action蹋砚,接觸過iOS開發(fā)的人都不會(huì)陌生
UIControlEventTouchUpInside,這就是按下并松開的動(dòng)作摄杂。不僅僅是UIButton坝咐,還有UITextField也有目標(biāo)-動(dòng)
作模式。
使用前別忘了引用頭文件~
#import
接下來就是最關(guān)鍵的RAC代碼了析恢。
[[self.textFildrac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(idx){? ? NSLog(@"change");}];
就這么短短的兩行代碼墨坚。他實(shí)現(xiàn)了一個(gè)功能,即監(jiān)聽了textFild的UIControlEventEditingChanged事件映挂,當(dāng)事件發(fā)生時(shí)實(shí)現(xiàn)方法NSLog泽篮。
所以我們就可以以這段代碼為模板進(jìn)行RAC的使用,舉一反三柑船,以后的UIButton點(diǎn)擊事件我們都可以用RAC方法進(jìn)行添加帽撑,再也不用add Target了。
對(duì)于textFild的文字更改監(jiān)聽也有更簡(jiǎn)單的寫法
[[self.textFildrac_textSignal] subscribeNext:^(idx){? ? NSLog(@"%@",x);}];
這樣就是每次改變TextFild都輸出改變后的結(jié)果鞍时。
再比如給我們的某個(gè)label添加一個(gè)手勢(shì)動(dòng)作亏拉,我們也可以用簡(jiǎn)單的RAC代碼完成
UITapGestureRecognizer*tap = [[UITapGestureRecognizeralloc] init];[[tap rac_gestureSignal] subscribeNext:^(idx) {NSLog(@"tap");}];[self.viewaddGestureRecognizer:tap];
這段具體我就不解釋了,相信大家都能看得懂逆巍,看不懂的自己寫寫就懂了及塘。
2.代理
用RAC寫代理是有局限的,它只能實(shí)現(xiàn)返回值為void的代理方法
首先我們要明白我們?yōu)槭裁匆肦AC寫代理锐极?答:簡(jiǎn)化代碼笙僚!是的,的確為了簡(jiǎn)化代碼灵再,為什么我要再這里強(qiáng)調(diào)這個(gè)味咳,是因?yàn)樵诖矸椒ㄖ形疑钌畹母惺艿?/p>
了RAC的優(yōu)點(diǎn)。一開始我也不愿意花功夫去學(xué)RAC檬嘀,但是我?guī)煾附o我舉了一個(gè)例子槽驶,如果一個(gè)View里有多個(gè)AlertView,每個(gè)AlertView
有很多個(gè)按鈕鸳兽,每個(gè)按鈕都有自己的點(diǎn)擊事件掂铐,我應(yīng)該怎么寫?我想了一下,不但每個(gè)按鈕需要打標(biāo)記全陨,而且每個(gè)AlertView也要打標(biāo)記爆班,然后再往代理點(diǎn)
擊事件里加各種方法,代碼就又臭又長(zhǎng)辱姨。那么讓我們看看RAC怎么寫代理方法柿菩。
UIAlertView*alertView = [[UIAlertViewalloc] initWithTitle:@"RAC"message:@"RAC TEST"delegate:selfcancelButtonTitle:@"cancel"otherButtonTitles:@"other",nil];[[selfrac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)]subscribeNext:^(RACTuple*tuple){NSLog(@"%@",tuple.first);NSLog(@"%@",tuple.second);NSLog(@"%@",tuple.third);}];[alertView show];
我們來看RAC的語句。@selector是指這次事件監(jiān)聽的方法fromProtocol指依賴的代理雨涛。這里block中有一個(gè)RACTuple枢舶,他相當(dāng)于是一個(gè)集合類,他下面的first替久,second等就是類的各個(gè)參數(shù)凉泄,我這里點(diǎn)了AlertView第二個(gè)按鈕other輸出了一下。
2016-01-0418:24:29.114RACStudyTest[5003:388870] >2016-01-0418:24:29.115RACStudyTest[5003:388870]12016-01-0418:24:29.115RACStudyTest[5003:388870] (null)
可以看出tuple.second是ButtonAtIndex中Button的序號(hào)蚯根。那么對(duì)于上面那個(gè)我舉的例子后众,就可以用switch給各個(gè)按鈕添加方法,這樣的代碼看起來更容易理解颅拦,方面后期維護(hù)蒂誉。
當(dāng)然了,AlertView代理也有簡(jiǎn)化的代碼距帅。
[[alertViewrac_buttonClickedSignal] subscribeNext:^(idx){? ? NSLog(@"%@",x);}];
這里的x就是各個(gè)Button的序號(hào)了拗盒,可以直接應(yīng)對(duì)我上述遇到的問題。
3.通知
在我們的開發(fā)中通知也是一個(gè)比較常用的功能锥债,主要的應(yīng)用場(chǎng)景是某個(gè)頁面進(jìn)行數(shù)據(jù)重傳需要更新model但是點(diǎn)擊返回棧時(shí)不會(huì)刷新返回界面的數(shù)據(jù)陡蝇,這時(shí)就可以用通知來更新另一個(gè)頁面的數(shù)據(jù),當(dāng)然我們也可以在另一個(gè)頁面的ViewDidAppear方法中刷新數(shù)據(jù)哮肚,但那是題外話登夫。
這里寫的Demo就是我上述說的情況。
首先允趟,在某個(gè)頁面中我們需要發(fā)出通知恼策,這里就是最基本的通知的寫法。發(fā)送名為postdata的通知并傳送一個(gè)數(shù)組dataArray潮剪。
NSMutableArray*dataArray = [[NSMutableArrayalloc] initWithObjects:@"1",@"2",@"3",nil];[[NSNotificationCenterdefaultCenter] postNotificationName:@"postData"object:dataArray];
而在接受的頁面我們需要增加觀察者并接受數(shù)組涣楷,這時(shí)我們的RAC就派上用場(chǎng)了。
[[[NSNotificationCenterdefaultCenter] rac_addObserverForName:@"postData"object:nil] subscribeNext:^(NSNotification*notification){? ? NSLog(@"%@", notification.name);NSLog(@"%@", notification.object);}];
當(dāng)這個(gè)頁面監(jiān)聽到名為postdata的通知時(shí)他就會(huì)執(zhí)行block中的方法抗碰,當(dāng)然這里的參數(shù)改成id x也是可以的狮斗,這里用NSNotification主要是強(qiáng)調(diào)它的類型。讓我們看看控制臺(tái)的輸出弧蝇。
2016-01-0420:10:52.274RACStudyTest[5918:439077] postData2016-01-0420:10:52.275RACStudyTest[5918:439077] (1,2,3)
可見碳褒,notification.object就是我們想要的數(shù)組折砸,當(dāng)然我們也可以傳一些model。值得一提的是沙峻,RAC中的通知不需要remove observer睦授,因?yàn)樵趓ac_add方法中他已經(jīng)寫了remove。
4.KVO
RAC中得KVO大部分都是宏定義摔寨,所以代碼異常簡(jiǎn)潔去枷,簡(jiǎn)單來說就是RACObserve(TARGET, KEYPATH)這種形式,TARGET是監(jiān)聽目標(biāo)是复,KEYPATH是要觀察的屬性值删顶,這里舉一個(gè)很簡(jiǎn)單的例子,如果UIScrollView滾動(dòng)則輸出success佑笋。
UIScrollView*scrolView = [[UIScrollViewalloc] initWithFrame:CGRectMake(0,0,200,400)];scrolView.contentSize=CGSizeMake(200,800);scrolView.backgroundColor= [UIColorgreenColor];[self.viewaddSubview:scrolView];[RACObserve(scrolView, contentOffset) subscribeNext:^(idx) {NSLog(@"success");}];