(-)簡介
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架奇徒。框架github地址
當(dāng)我們在寫項目的時候,會對應(yīng)很多事件響應(yīng)缨硝,如:例如按鈕的點(diǎn)擊摩钙,收到網(wǎng)絡(luò)消息,屬性的變化(通過KVO)或者用戶位置的變化(通過CoreLocation)查辩。但是這些事件都用不同的方式來處理胖笛,比如action、delegate宜岛、KVO长踊、callback等。ReactiveCocoa為事件定義了一個標(biāo)準(zhǔn)接口萍倡,從而可以使用一些基本工具來更容易的連接身弊、過濾和組合×星茫可以使代碼高聚合佑刷、低耦合。更多簡介不再復(fù)述酿炸,官方框架簡介地址:
(二)使用例子
筆者的podfile內(nèi)容
use_frameworks!
pod 'ReactiveCocoa', '~> 4.1.0'
1:按鈕響應(yīng)點(diǎn)擊事件
方法使按鈕的動作不再是一個方法了,而換成了一個block.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(100, 100, 100, 100)];
[button setBackgroundColor:[UIColor redColor]];
[self.view addSubview:button];
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"點(diǎn)擊按鈕了");
}];
筆者之前也寫過一個封裝過一個按鈕的例子涨冀,也可以用block來返回按鈕的點(diǎn)擊動作填硕。歡迎查看簡書地址。
2:替換代理
可以不再用代理來監(jiān)聽自定義視圖的動作鹿鳖,而換成了一個block.
1)初始化一個自定義視圖扁眯,觸發(fā)一個手勢動作
#import "TestView.h"
@implementation TestView
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self doDelegate];
}
-(void)doDelegate{
NSLog(@"--doDelegate--");
}
@end
2)在控制器里監(jiān)聽這個動作
TestView *testView = [[TestView alloc]initWithFrame:CGRectMake(100, 160, 100, 40)];
testView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:testView];
[[testView rac_signalForSelector:@selector(doDelegate)]subscribeNext:^(id x) {
NSLog(@"觸發(fā)自定義視圖的代理方法了");
}];
但是這種方法是不能傳參數(shù)的,如果需要傳遞參數(shù)需要在自定義的視圖里添加一個屬性
@property (nonatomic, strong) RACSubject *delegateSignal;
在m文件里初始化這個信號,并且發(fā)送信號
- (RACSubject *)delegateSignal
{
if (_delegateSignal == nil) {
_delegateSignal = [RACSubject subject];
}
return _delegateSignal;
}
-(void)doDelegate{
NSLog(@"--doDelegate--");
[self.delegateSignal sendNext:@"觸發(fā)代理了"];
}
然后才能在控制器里訂閱這個信號翅帜,處理這個代理
[testView.delegateSignal subscribeNext:^(id x) {
NSLog(@"--%@----",x);
}];
這樣就完成了有參數(shù)的代理的替換
3:監(jiān)聽通知事件
不再使用方法來接受通知姻檀,而換成了一個block.
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"testNotification"
object:nil] subscribeNext:^(id x) {
NSLog(@"接收到testNotification通知了");
}];
(三)更多
本文只是簡單介紹了幾個用途,還有很多就不一一列舉了涝滴。
ReactiveCocoa框架為很多系統(tǒng)類添加了分類:
NSData+RACSupport.h
NSFileHandle+RACSupport.h
NSString+RACSupport.h
NSURLConnection+RACSupport.h
UITextField+RACSignalSupport.h
NSObject+RACSelectorSignal.h
NSNotificationCenter+RACSupport.h
UIControl+RACSignalSupport.h
等等绣版。更多功能到代碼里找找
測試?yán)?a target="_blank" rel="nofollow">github地址