學(xué)習(xí)RAC小記-適合給新手看的RAC用法總結(jié)

最近葉大直播寫代碼,我也做點小筆記。


什么是RAC?

幾乎每一篇介紹RAC的文章開頭都是這么一個問題。我這篇文章是寫給新手(包括我自己)看的,所以這個問題更是無法忽視。

簡單的說,RAC就是一個第三方庫,他可以大大簡化你的代碼過程。

官方的說,ReactiveCocoa(其簡稱為RAC)是由GitHub開源的一個應(yīng)用于iOS和OS X開發(fā)的新框架。RAC具有函數(shù)式編程響應(yīng)式編程的特性。

為什么我們要學(xué)習(xí)RAC?

為了提高我們的開發(fā)效率。RAC在某些特定情況下開發(fā)時可以大大簡化代碼,并且目前來看安全可靠。

配置RAC環(huán)境

我習(xí)慣用cocoapods來安裝github上得開源庫,不會的新手iOS開發(fā)者有興趣可以去學(xué)一下。

想學(xué)習(xí)cocoapods的同學(xué)推薦唐巧前輩的文章。

platform:ios, '8.0'
pod 'ReactiveCocoa','~>2.1.8'

這里有一點要注意下就是RAC的版本問題,由于還沒學(xué)習(xí)Swift,所以我是用OC編寫程序的,最新版的RAC已經(jīng)支持Swift了,但是在OC的程序安裝最新版的RAC可能跑不起來,所以推薦大家使用2.5.0版本以下的RAC(具體支持Swift的版本可能有誤,但我引用的2.1.8肯定是沒問題的)。

使用RAC

1.target-action

RAC最基本的入門使用技巧就是對事件的監(jiān)聽。

PS:在iOS開發(fā)中,我們所說的點擊事件其實就是target-action,接觸過iOS開發(fā)的人都不會陌生UIControlEventTouchUpInside,這就是按下并松開的動作。不僅僅是UIButton,還有UITextField也有目標(biāo)-動作模式。

使用前別忘了引用頭文件~

#import <ReactiveCocoa/ReactiveCocoa.h>

接下來就是最關(guān)鍵的RAC代碼了。

[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x){
    NSLog(@"change");
}];

就這么短短的兩行代碼。他實現(xiàn)了一個功能,即監(jiān)聽了textFild的UIControlEventEditingChanged事件,當(dāng)事件發(fā)生時實現(xiàn)方法NSLog
所以我們就可以以這段代碼為模板進行RAC的使用,舉一反三,以后的UIButton點擊事件我們都可以用RAC方法進行添加,再也不用add Target了。
對于textFild的文字更改監(jiān)聽也有更簡單的寫法

[[self.textFild rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

這樣就是每次改變TextFild都輸出改變后的結(jié)果。

再比如給我們的某個label添加一個手勢動作,我們也可以用簡單的RAC代碼完成

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
    NSLog(@"tap");
}];
[self.view addGestureRecognizer:tap];

這段具體我就不解釋了,相信大家都能看得懂,看不懂的自己寫寫就懂了。

2.代理

用RAC寫代理是有局限的,它只能實現(xiàn)返回值為void的代理方法

首先我們要明白我們?yōu)槭裁匆肦AC寫代理?答:簡化代碼!是的,的確為了簡化代碼,為什么我要再這里強調(diào)這個,是因為在代理方法中我深深的感受到了RAC的優(yōu)點。一開始我也不愿意花功夫去學(xué)RAC,但是我?guī)煾附o我舉了一個例子,如果一個View里有多個AlertView,每個AlertView有很多個按鈕,每個按鈕都有自己的點擊事件,我應(yīng)該怎么寫?我想了一下,不但每個按鈕需要打標(biāo)記,而且每個AlertView也要打標(biāo)記,然后再往代理點擊事件里加各種方法,代碼就又臭又長。那么讓我們看看RAC怎么寫代理方法。

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"RAC TEST" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
[[self rac_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中有一個RACTuple,他相當(dāng)于是一個集合類,他下面的first,second等就是類的各個參數(shù),我這里點了AlertView第二個按鈕other輸出了一下。

2016-01-04 18:24:29.114 RACStudyTest[5003:388870] <UIAlertView: 0x7ff260c90c70; frame = (0 0; 0 0); layer = <CALayer: 0x7ff260c91030>>
2016-01-04 18:24:29.115 RACStudyTest[5003:388870] 1
2016-01-04 18:24:29.115 RACStudyTest[5003:388870] (null)

可以看出tuple.second是ButtonAtIndex中Button的序號。那么對于上面那個我舉的例子,就可以用switch給各個按鈕添加方法,這樣的代碼看起來更容易理解,方面后期維護。

當(dāng)然了,AlertView代理也有簡化的代碼。

[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

這里的x就是各個Button的序號了,可以直接應(yīng)對我上述遇到的問題。

3.通知

在我們的開發(fā)中通知也是一個比較常用的功能,主要的應(yīng)用場景是某個頁面進行數(shù)據(jù)重傳需要更新model但是點擊返回棧時不會刷新返回界面的數(shù)據(jù),這時就可以用通知來更新另一個頁面的數(shù)據(jù),當(dāng)然我們也可以在另一個頁面的ViewDidAppear方法中刷新數(shù)據(jù),但那是題外話。

這里寫的Demo就是我上述說的情況。

首先,在某個頁面中我們需要發(fā)出通知,這里就是最基本的通知的寫法。發(fā)送名為postdata的通知并傳送一個數(shù)組dataArray。

NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:dataArray];

而在接受的頁面我們需要增加觀察者并接受數(shù)組,這時我們的RAC就派上用場了。

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"postData" object:nil] subscribeNext:^(NSNotification *notification) {
    NSLog(@"%@", notification.name);
    NSLog(@"%@", notification.object);
}];

當(dāng)這個頁面監(jiān)聽到名為postdata的通知時他就會執(zhí)行block中的方法,當(dāng)然這里的參數(shù)改成id x也是可以的,這里用NSNotification主要是強調(diào)它的類型。讓我們看看控制臺的輸出。

2016-01-04 20:10:52.274 RACStudyTest[5918:439077] postData
2016-01-04 20:10:52.275 RACStudyTest[5918:439077] (
1,
2,
3
)

可見,notification.object就是我們想要的數(shù)組,當(dāng)然我們也可以傳一些model。值得一提的是,RAC中的通知不需要remove observer,因為在rac_add方法中他已經(jīng)寫了remove。

4.KVO

RAC中得KVO大部分都是宏定義,所以代碼異常簡潔,簡單來說就是RACObserve(TARGET, KEYPATH)這種形式,TARGET是監(jiān)聽目標(biāo),KEYPATH是要觀察的屬性值,這里舉一個很簡單的例子,如果UIScrollView滾動則輸出success。

UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
scrolView.contentSize = CGSizeMake(200, 800);
scrolView.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrolView];
[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {
    NSLog(@"success");
}];

如果你好好回顧下KVO的寫法會不會更加感嘆RAC的強大呢?

總結(jié)

RAC的東西很多,但相信這篇文章給大家入門還是可以的,這里介紹了RAC得基本使用方法,但是還有很多好用的東西比如信號都沒介紹,甚至除了subscribeNext還有subscribeComplete和subscribeError,這些都是我給自己留得坑,以后也會發(fā)文介紹給大家。也歡迎來我的博客看看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近看到好多人用到RAC,就簡單的看了一些別的大神文章,寫出來了一點 什么是RAC? 幾乎每一篇介紹RAC的文章開...
    53a48e34aea2閱讀 1,228評論 1 8
  • 使用RAC 1.target-action RAC最基本的入門使用技巧就是對事件的監(jiān)聽。 PS:在iOS開發(fā)中,我...
    第三天閱讀 1,030評論 2 0
  • 1. 大學(xué)之前,寫的文章還可以。上了大學(xué),幾乎沒寫過文章?,F(xiàn)在的自己,文筆很爛,見識也不夠廣。但我還是想寫文。就算...
    清瞳鳳歌閱讀 327評論 0 0
  • 水彩顏料:櫻花24色(用到的顏料有檸檬黃 玫瑰紅 永固橙色 淺紅 熟褐 象牙黑) 毛筆:中白云 秀意 紙:寶虹30...
    努力暴富閱讀 1,114評論 0 4
  • 往事如花 開在你必經(jīng)的路邊 回眸歲月的枝頭 你我的流年 沉默不語 歲月在此時仰望悲愴 也許有一天 你再無需隱藏什么...
    小鳥笑笑閱讀 181評論 0 3

友情鏈接更多精彩內(nèi)容