一、配置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),以便查閱。