ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。RAC结合了函数式编程(Functional Programming)和响应式编程(React Programming)的框架,也可称其为函数响应式编程(FRP)框架 。
作用
RAC最大的优点是 提供了一个单一的、统一的方法去处理异步的行为,包括 Delegate,Blocks Callbacks,Target-Action机制,Notifications和KVO。
它最大的与众不同是提供了一种新的写代码的思维,由于RAC将Cocoa中KVO、UIKit Event、Delegate、Selector等都增加了RAC支持,所以都不用去做很多跨函数的事,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想。
核心
ReactiveCocoa核心就是RACSignal。RACSignal (信号)对于 RAC 来说是构造单元。它代表我们最终将要收到的信息,表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据,所以你可以开始预先(陈述性)运用逻辑并构建你的信息流,而不是必须等到事件发生(命令式)。
信号会为了控制通过应用的信息流而获得所有这些异步方法(委托, 回调 block,通知,KVO, target/action 事件观察等)并将它们统一到一个接口下。不仅是这些,因为信息会流过你的应用, 它还提供给你轻松转换/分解/合并/过滤信息的能力。
1.简单使用// 1. 创建信号
RACSubject *subject = [[RACSubject alloc] init];
// 2. 订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
// 3. 发送信号
[subject sendNext:@"约么?"];
[[self.tableView rac_signalForSelector:@selector(tableView: didSelectRowAtIndexPath:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"%@",x);
}];
2.view 向controller反向传值
// view向控制器反向传值步骤
// 1. view里面创建信号
- (RACSubject *)subject
{
if (!_subject) {
_subject = [RACSubject subject];
}
return _subject;
}
// 2. view里面发送信号
[_subject sendNext:@"view反向传值给控制器"];
// 3. controller里面订阅信号
[self.yqView.subject subscribeNext:^(id _Nullable x) {
NSLog(@"x=%@",x);
}];
// 4.还可以这样写,更简单
[[self.yqView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"%@",x);
}];
3. 按钮的target rac_signalForControlEvents
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"x=%@",x);
}];
4. kvo
[self.yqView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
NSLog(@"来了");
}];
5.通知
// 通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"x=%@",x);
}];
6.监听文本框
[self.textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"x=%@",x);
}];