使用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");
}];