ReactiveCocoa入門

什麼是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秒執行一次");
    }];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章