什麼是ReactiveCocoa?
ReactiveCocoa(簡稱RAC),是由Github開源的一個應用於iOS和OS X開發的新框架。RAC具有函數式編程(FP)和響應式編程(RP)的特性。
ReactiveCocoa的宗旨是Stream of values over time,隨着時間而不斷流動的數據流。
ReactiveCocoa主要解決了以下這些問題
- UI數據綁定
UI控件通常需要綁定一個事件,RAC可以很方便的綁定任何數據流到控件上。
- 用戶交互事件綁定
RAC爲可綁定的UI控件提供了一些列能發送Signal信號的方法。這些數據流會在用戶交互中互相傳遞
- 解決狀態以及狀態之間依賴過多的問題
有了RAC的綁定之後,可以不用再關心各種複雜的狀態,isSelect,isFinish……也解決了這些狀態在後期很難維護的問題
- 消息傳遞機制的大統一
OC中編程原來消息傳遞機制有以下幾種:delegate,block callback,target-action,timers,KVO。現在這些方式都統一用RAC來處理,下面我會用RAC簡單實現這些方式。
RAC的基本使用
1. target-action
RAC最基本的入門使用就是對事件的監聽
```
[[self.textField rac_signalForControlEvents:UIControlEventEditingDidEndOnExit] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"change");
}];
```
上面就實現了監聽textField的UIControlEventEditingDidEndOnExit事件,再也不用add target了,其他UIbutton的可以類比
還有手勢也類似
```
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[tap rac_gestureSignal] subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
NSLog(@"tap");
}];
[self.view addGestureRecognizer:tap];
```
2.代理
用RAC寫代理是有侷限的,它只能實現返回值爲void的代理方法,但是代理可以簡化代碼,實現形式是rac_signalForSelector: fromProtocol:
UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
scrolView.contentSize = CGSizeMake(200, 800);
scrolView.backgroundColor = [UIColor greenColor];
scrolView.delegate = self;
[self.view addSubview:scrolView];
//這裏訂閱收到的是一個x,當一個頁面存在多個tableview時,我們可以對x進行判斷看是哪個tableview
[[self rac_signalForSelector:@selector(scrollViewWillBeginDragging:) fromProtocol:@protocol(UIScrollViewDelegate)] subscribeNext:^(RACTuple * x) {
NSLog(@"點擊了");
NSLog(@"%@---%@",x.first,x.second);
}];
@selector
是指這次監聽的方法,fromProtocol
指依賴的代理,block中有個RACTuple,相當於集合類,下面的first,second等就是類的各個參數
3.通知
- 讓textField成爲第一響應者,接收鍵盤彈出的通知,可以這麼寫
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"鍵盤彈出");
}];
4.KVO
RAC中的KVO大部分都是宏定義,代碼非常簡潔,實現形式是RACObserve(TARGET,KEYPATH)
,TARGET
是監聽目標,KEYPATH
是要觀察的屬性值,下面以UIScrollView滾動爲例
```
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(@"contentOffset---%@",x);
}];
```
5.timers
延時執行
//3秒後執行一次 [[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{ NSLog(@"3秒後執行一次"); }];
延時執行
//每隔2秒執行一次 [[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { NSLog(@"每隔2秒執行一次"); }];