什么是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秒執行一次");}];