使用RAC
1.target-action
RAC最基本的入門使用技巧就是對事件的監(jiān)聽。
PS:在iOS開發(fā)中周荐,我們所說的點擊事件其實就是target-action,接觸過iOS開發(fā)的人都不會陌生UIControlEventTouchUpInside,這就是按下并松開的動作。不僅僅是UIButton彪薛,還有UITextField也有目標-動作模式。
[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x){
NSLog(@"change");
}];
就這么短短的兩行代碼怠蹂。他實現(xiàn)了一個功能善延,即監(jiān)聽了textFild的UIControlEventEditingChanged事件,當事件發(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的代理方法
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,他相當于是一個集合類颊艳,他下面的first茅特,second等就是類的各個參數(shù),我這里點了AlertView第二個按鈕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的序號白修。那么對于上面那個我舉的例子,就可以用switch給各個按鈕添加方法重斑,這樣的代碼看起來更容易理解兵睛,方面后期維護。
當然了,AlertView代理也有簡化的代碼祖很。
[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
這里的x就是各個Button的序號了笛丙,可以直接應(yīng)對我上述遇到的問題。
3.通知
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);
}];
當這個頁面監(jiān)聽到名為postdata的通知時他就會執(zhí)行block中的方法,當然這里的參數(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ù)組傲须,當然我們也可以傳一些model。值得一提的是趟脂,RAC中的通知不需要remove observer泰讽,因為在rac_add方法中他已經(jīng)寫了remove。
4.KVO
RAC中得KVO大部分都是宏定義昔期,所以代碼異常簡潔已卸,簡單來說就是RACObserve(TARGET, KEYPATH)這種形式,TARGET是監(jiān)聽目標硼一,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");
}];