关于ReactiveObjC的使用,其实在16年的时候就已经被开发者们开始使用,之前一直没有触及到,最近写项目的时候,关于这个动态响应链的框架有了一些了解,确实非常粗暴强大,在这里记录一下基本的一些使用。
1.替代delegate
创建RACSubject 信号,用来替代代理,使用方法如下:
/* 创建信号 */
RACSubject *subject = [RACSubject subject];
/* 发送信号 */
[subject sendNext:@"发送信号"];
在别的地方使用的时候
/* 订阅信号(通常在别的视图控制器中订阅,与代理的用法类似) */
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"信号内容:%@", x);
}];
2.信号的删除
由于信号一般创建后,相当于是全局的,如果这个对象的信号没有随着对象被释放,那么在全局任何时候都是可以触发这个信号源的。(常见的是对导航栏监控了信号源,如果不在某个页面进行释放掉这个信号源,那么全局的导航栏只要触发了导航栏方法,就会触发这个信号源)
/* 创建信号 */
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
/* 发送信号 */
[subscriber sendNext:@"发送信号"];
return nil;
}];
/* 订阅信号 */
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"信号内容:%@", x);
}];
/* 取消订阅 */
[disposable dispose];
3.监听 TextField 的输入改变(其他控件差不多的使用方法,这里举个例子)
/* 监听 TextField 的输入(内容改变就会调用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
/* 添加监听条件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 5; // 表示输入文字长度 > 5 时才会调用下面的 block
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
4.代理KVO监听
可以代替 KVO 监听,下面表示把监听 view 的 frame 属性改变转换成信号,只要值改变就会发送信号。
[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
还有一种更简单的写法,就是利用 RAC 的宏,和上面的效果是一样的。
[RACObserve(view, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
5.监听方法
可以直接对某个控制器内部的方法进行操作一系列代码,挺牛b的.
[[h5VC rac_signalForSelector:@selector(viewWillAppear:)] subscribeNext:^(RACTuple * _Nullable x) {
//在viewwillappear的时候做一系列操作
}];
暂时先就这么多,以后再更新,很多可以举一反三的,非常强大,之前有接触过但没怎么用,现在也给我集成项目中了,除了能带来一些方便以外,确实还能解决一些我们平时无法做的的操作,所以我才用了0.0(当无计可施的时候,用了这个才发现有用呀)。