RAC 的簡(jiǎn)單應(yīng)用

最近看到好多人用到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");}];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斑鼻,隨后出現(xiàn)的幾起案子蒋纬,更是在濱河造成了極大的恐慌,老刑警劉巖坚弱,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀备,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荒叶,警方通過查閱死者的電腦和手機(jī)碾阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來些楣,“玉大人脂凶,你說我怎么就攤上這事〕钭拢” “怎么了蚕钦?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鹅很。 經(jīng)常有香客問我嘶居,道長(zhǎng),這世上最難降的妖魔是什么促煮? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任邮屁,我火速辦了婚禮,結(jié)果婚禮上菠齿,老公的妹妹穿的比我還像新娘佑吝。我一直安慰自己,他們只是感情好绳匀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布迹蛤。 她就那樣靜靜地躺著民珍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盗飒。 梳的紋絲不亂的頭發(fā)上嚷量,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音逆趣,去河邊找鬼蝶溶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宣渗,可吹牛的內(nèi)容都是我干的抖所。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痕囱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼田轧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞍恢,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤傻粘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帮掉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弦悉,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蟆炊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稽莉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涩搓,死狀恐怖污秆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昧甘,我是刑警寧澤混狠,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站疾层,受9級(jí)特大地震影響将饺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痛黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一予弧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湖饱,春花似錦掖蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽致讥。三九已至,卻和暖如春器赞,著一層夾襖步出監(jiān)牢的瞬間垢袱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工港柜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留请契,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓夏醉,卻偏偏與公主長(zhǎng)得像爽锥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畔柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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