RAC(ReactiveCocoa)小記-新人必看

一、配置RAC環(huán)境 :

platform:ios, '8.0'
pod 'ReactiveCocoa','~>2.1.8'

二、RAC能干什么?

1、對(duì)事件的監(jiān)聽(tīng)

例如我們監(jiān)聽(tīng)一個(gè)textfield輸入完成的事件,按照常規(guī)思路我們需要做如下操作:

//factoryTextField是一個(gè)工具方法,直接返回UITextField對(duì)象
 self.textField = [FactoryTool factoryTextField:@"請(qǐng)輸入" color:[UIColor blueColor]size:18];
 self.textField.delegate = self;
 self.textField.backgroundColor = [UIColor grayColor];
 [self.view addSubview:self.textField]; 
 [self.textField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.height.equalTo(@30);
        make.width.equalTo(self.view.mas_width).multipliedBy(0.5);
        
    }];

- (void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"%@",textField.text);

}

通過(guò)代理UITextField的代理方法 我們來(lái)獲取到用戶(hù)輸入完成
textFieldDidEndEditing 從而達(dá)到監(jiān)聽(tīng)UITextField的需求。

如果我們使用RAC的監(jiān)聽(tīng)方法,則只要2行代碼搞定:

[[self.textField rac_signalForControlEvents:UIControlEventEditingDidEnd] subscribeNext:^(id x){
    //x是textField對(duì)象
        NSLog(@"%@",x);
    }];

或者使用下面的更加簡(jiǎn)單的方法:


[[self.textField rac_textSignal]subscribeNext:^(id x) {
       
        NSLog(@"%@",x);
        
    }];

備注:后面的方法相當(dāng)于是監(jiān)聽(tīng)了 UIControlEventEditingChanged 在textfield值更改一次后,就會(huì)調(diào)用一次這個(gè)block方法。

RAC還可以監(jiān)聽(tīng)tap事件,假如我們就在當(dāng)前控制的View上增加一個(gè)tap事件:


UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
    
    [[tap rac_gestureSignal]subscribeNext:^(id x) {
       
        NSLog(@"%@",x);
        
    }];
    
    [self.view addGestureRecognizer:tap];

在每次tap當(dāng)時(shí)view時(shí),block就會(huì)執(zhí)行一次,是不是感覺(jué)方便很多,不用寫(xiě)自定義方法.啦.
當(dāng)然RAC還可以監(jiān)聽(tīng)其他控件,比如比較常用的uibutton等等,經(jīng)過(guò)測(cè)試 只要是UIControlEvents 枚舉的都可以被監(jiān)聽(tīng),可自行去測(cè)試。

typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
    UIControlEventTouchDown                                         = 1 <<  0,      // on all touch downs
    UIControlEventTouchDownRepeat                                   = 1 <<  1,      // on multiple touchdowns (tap count > 1)
    UIControlEventTouchDragInside                                   = 1 <<  2,
    UIControlEventTouchDragOutside                                  = 1 <<  3,
    UIControlEventTouchDragEnter                                    = 1 <<  4,
    UIControlEventTouchDragExit                                     = 1 <<  5,
    UIControlEventTouchUpInside                                     = 1 <<  6,
    UIControlEventTouchUpOutside                                    = 1 <<  7,
    UIControlEventTouchCancel                                       = 1 <<  8,

    UIControlEventValueChanged                                      = 1 << 12,     // sliders, etc.
    UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 13,     // semantic action: for buttons, etc.

    UIControlEventEditingDidBegin                                   = 1 << 16,     // UITextField
    UIControlEventEditingChanged                                    = 1 << 17,
    UIControlEventEditingDidEnd                                     = 1 << 18,
    UIControlEventEditingDidEndOnExit                               = 1 << 19,     // 'return key' ending editing

    UIControlEventAllTouchEvents                                    = 0x00000FFF,  // for touch events
    UIControlEventAllEditingEvents                                  = 0x000F0000,  // for UITextField
    UIControlEventApplicationReserved                               = 0x0F000000,  // range available for application use
    UIControlEventSystemReserved                                    = 0xF0000000,  // range reserved for internal framework use
    UIControlEventAllEvents                                         = 0xFFFFFFFF
};

2、RAC 執(zhí)行UIAlertView代理方法 只能執(zhí)行無(wú)返回值的代理方法,所以要慎用!
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"RAC TEST" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
    
    [alertView show];
    [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {
        NSLog(@"%@",tuple.first);
        NSLog(@"%@",tuple.second);
        NSLog(@"%@",tuple.third);
    }];

上面的Block可以換成下面的2行代碼搞定:

[[alertView rac_buttonClickedSignal]subscribeNext:^(id x) {
       
        NSLog(@"%@",x);//可以拿到alertView每個(gè)index的值
        
    }];

3、RAC處理通知

我們?cè)谀硞€(gè)控制器直接發(fā)送一個(gè)通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"RACNotification" object:@[@"1",@"2"]];

在接收"RACNotification"的控制器中可輕松拿到通知傳的值

 [[[NSNotificationCenter defaultCenter]rac_addObserverForName:@"RACNotification" object:nil]subscribeNext:^(id x) {
       
        NSLog(@"%@",x);
        
    }];

此處的id x 的id 類(lèi)型就是NSNotification的類(lèi)型,可以使用NSNotification來(lái)代替..
RAC的通知有一個(gè)很棒的地方,add的通知,我們不需要再dealloc中進(jìn)行移除,對(duì)于懶人比較適合....

三、啥時(shí)候使用RAC

網(wǎng)上一個(gè)大牛說(shuō)的一句話(huà):只要用到add target時(shí) 都可以用RAC來(lái)代替,秒懂了哇!

1、歡迎來(lái)到Biny博客!

2、專(zhuān)注于iOS移動(dòng)端開(kāi)發(fā),歡迎廣大大師們、大神們吐槽.....

3、歡迎友情鏈接 網(wǎng)站名:Biny博客 網(wǎng)址:http://www.Xcode.cc 描述:Biny博客是一個(gè)技術(shù)博客,文章主要包含移動(dòng)互聯(lián)IOS相關(guān)內(nèi)容,記錄一些在IOS編碼過(guò)程中遇到的坑和看到大神們記錄下的經(jīng)驗(yàn),以便查閱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容