1.安装
pod 'ReactiveObjC', '~> 3.1.0'
2.1使用
#import "ReactiveObjC.h"
@property(nonatomic ,strong)id<RACSubscriber>subscri;
@property(nonatomic ,strong)RACSignal *signal;
// 创建信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
self.subscri = subscriber;
return [RACDisposable disposableWithBlock:^{
NSLog(@"当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。执行完Block后,当前信号就不在被订阅了。。。");
}];
}];
self.signal = signal;
// 订阅信号
[signal subscribeNext:^(id x) { // 发送数据:即调用sendNext时才会调用该代码块
NSLog(@"接收数据: %@", x); // 接收数据: 123
}];
//发送信号
[self.subscri sendNext:@"dddd"];
//完成并结束信号
[self.subscri sendCompleted];
self.subscri = nil;
self.signal = nil;
信息流和订阅者
信号类继承自RACStream(流),所以信号类也是一种流,在响应式框架中一切皆是流,该类是RAC框架中最基础,最核心的类,在内部可以使用订阅者来发送 id值value、错误error、完成completed。
信号是用来被订阅的,也就是被观察的,一但数据流中的数据发生变化就能被观察到,一但观察到就会执行关联的nextBlock代码块,订阅者可以发送任意值Value、错误error、完成completed 等变化来传播
2.2:RACSubject :既能订阅信号,也能发送信号
RACSubject :
该类继承自RACSignal,同是也遵守了RACSubscriber订阅者协议,所以该类既能订阅信号,同时也能发送信号;
// 1. 创建信号 RACSubject *subject = [RACSubject subject];
// 2. 订阅信号 [subject subscribeNext:^(id x) { NSLog(@"接收到值:%@", x); }];
// 3. 发送信号 [subject sendNext:@"123"];
2.3:RACReplaySubject类
该类继承自RACSubject类,订阅信号和发送信号的顺序没有要求,可以先订阅信号,再发送信号;也可以先发送信号再订阅信号
// 1. 创建信号 RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 发送信号 [replaySubject sendNext:@"123"];
// 订阅信号 [replaySubject subscribeNext:^(id x) { NSLog(@"订阅者1接收到值:%@", x); }];
3:使用篇
3.1 KVO
// 使用该方法需要手动导入"NSObject+RACKVOWrapper.h"头文件,主头文件中并没有包含该头文件
[self.view rac_observeKeyPath:@"alpha" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
NSLog(@"change:%@", change);
}];
3.2 监听按钮
[[_button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"按钮被点击了:%@", x);
}];
3.3 通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) { NSLog(@"键盘即将显示");
}];
3.4 监听文本内容改变
[[textField rac_textSignal] subscribeNext:^(id x) { NSLog(@"文本框内容改变了:%@", x); }];
4.RAC中常用的宏
4.1RAC(obj, property) = signal; // 将信号发送的值赋值给某个对象的某个属性
RAC(_label, text) = _textField.rac_textSignal; //上面的代码等于下面的代码
[_textField.rac_textSignal subscribeNext:(id x){ _label.text = x; }];
4.2RACObserve(obj, property); // 返回一个信号,可以去订阅
[RACObserve(self.view, backgroundColor) subscribeNext:^(id x) { NSLog(@"x=%@", x); }]; // 上面代码是下面代码的简写形式
[[self.view rac_valuesAndChangesForKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"x:%@", x); }];
@weakify(self); 将self变成弱指针
@strongify(self); 在代码块中将self变成强指针
5:RAC常见的操作方法:操作方法位于RACSignal类中,所有信号都可以调用
- bind(绑定)
- flattenMap(平铺映射):底层调用的是bind
- map(映射)
- concat (组合-连接):拿到所有信号的值
- then :底层调用的concat,
- merge(合并)
- zipWith(压缩)
- combineLatest(聚合)
- filter(过滤)满足条件才能订阅到值
例子:
signal = [signal filter:^BOOL(id _Nullable value) {
return [value length]>=2;
}];