RAC iOS

使用RAC

1.target-action

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

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

[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x){

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了。

對于textFild的文字更改監(jiān)聽也有更簡單的寫法

[[self.textFild rac_textSignal] subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

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

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

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];

[[tap rac_gestureSignal] subscribeNext:^(id x) {

NSLog(@"tap");

}];

[self.view addGestureRecognizer:tap];

2.代理

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

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中有一個(gè)RACTuple,他相當(dāng)于是一個(gè)集合類,他下面的first,second等就是類的各個(gè)參數(shù),我這里點(diǎn)了AlertView第二個(gè)按鈕other輸出了一下。

2016-01-04 18:24:29.114 RACStudyTest[5003:388870] >

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的序號。那么對于上面那個(gè)我舉的例子,就可以用switch給各個(gè)按鈕添加方法,這樣的代碼看起來更容易理解,方面后期維護(hù)。

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

[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

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

3.通知

NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:dataArray];

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

[[[NSNotificationCenter defaultCenter] 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)它的類型。讓我們看看控制臺的輸出。

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,因?yàn)樵趓ac_add方法中他已經(jīng)寫了remove。

4.KVO

RAC中得KVO大部分都是宏定義,所以代碼異常簡潔,簡單來說就是RACObserve(TARGET, KEYPATH)這種形式,TARGET是監(jiān)聽目標(biāo),KEYPATH是要觀察的屬性值,這里舉一個(gè)很簡單的例子,如果UIScrollView滾動(dòng)則輸出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");

}];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 最近看到好多人用到RAC,就簡單的看了一些別的大神文章,寫出來了一點(diǎn) 什么是RAC? 幾乎每一篇介紹RAC的文章開...
    53a48e34aea2閱讀 1,185評論 1 8
  • 簡介 ReactiveCocoa(簡稱為RAC),RAC具有函數(shù)響應(yīng)式編程特性,由Matt Diephouse開源...
    PHM閱讀 13,042評論 4 53
  • 前言 之前對RAC有了一個(gè)基本的認(rèn)識,了解了它的作用,以及RAC的運(yùn)行機(jī)制,我們知道只要是信號(RACSignal...
    大大盆子閱讀 4,518評論 0 11
  • 二、基本使用 #import// 導(dǎo)入頭文件 2-1、監(jiān)聽文本框使用 - (void)learnRACWithTe...
    清蘂翅膀的技術(shù)閱讀 375評論 0 0
  • “喂,肖,起來!你要接受問訊!”獄警打開了牢門,對著里面二十幾個(gè)囚犯吆喝。 一個(gè)染著栗色頭發(fā)、眼神空洞的少年站了起...
    猜晴尋閱讀 307評論 0 1