RAC中常见用法

  • 代替代理:rac_signalForSelector:
  • 代替KVO:rac_valuesAndChangesForKeyPath:
  • 监听事件:rac_signalForControlEvents:
  • 代替通知:rac_addObserverForName:
  • 监听文本框文字改变:rac_textSignal:
  • 多个请求结束后,才能刷新界面:rac_liftSelector:withSignalsFromArray:Signals:

1. rac_signalForSelector

监听某个方法的调用

// 把控制器调用didReceiveMemoryWarning转换成信号
[[self
rac_signalForSelector:@selector(didReceiveMemoryWarning)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@”控制器调用了didReceiveMemoryWarning”);
}];

代理的使用(但是无法传值)

WDYRedView *redView = [[WDYRedView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:redView];
[[redView rac_signalForSelector:@selector(clickView:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@”控制器知道RedView被点击了”);
}];


2. rac_valuesAndChangesForKeyPath:

监听frame属性的变化

WDYRedView *redView = [[WDYRedView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:redView];
[[redView rac_valuesForKeyPath:@”frame” observer:nil] subscribeNext:^(id _Nullable x) {
// x : 为改变后的值
NSLog(@”%@”, x);
}];
注意:使用以下方法也可打到同样效果
[redView rac_observeKeyPath:@”frame” options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
NSLog(@”监听到最新frame”);
}];
该方法需要额外加入一个头文件#import “NSObject+RACKVOWrapper.h”


3. rac_signalForControlEvents:

监听事件

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 100);
button.backgroundColor = [UIColor redColor];
[self.view addSubview:button];
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@”点击了按钮”);
}];


4. rac_addObserverForName:

监听通知

[[[NSNotificationCenter defaultCenter]
rac_addObserverForName:UIKeyboardDidShowNotification
object:nil]
subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@”键盘显示通知”);
}];


5. rac_textSignal:

监听文本框中文字的改变

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 100, 45)];
textField.layer.borderColor = [UIColor redColor].CGColor;
textField.layer.borderWidth = 1;
textField.layer.cornerRadius = 5;
textField.clipsToBounds = YES;
[self.view addSubview:textField];
[textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
// x:是最新文本数据
NSLog(@”%@”, x);
}];


6. rac_liftSelector:withSignalsFromArray:Signals:
 当一个界面中有多次请求时,需要保证全部都请求完成,才搭建界面,这时需要用到该方法。

RACSignal oneSignal = [RACSignal createSignal:^RACDisposable _Nullable(id _Nonnull subscriber) {
NSLog(@”请求模块一”);
[subscriber sendNext:@”数据一”];
return nil;
}];
RACSignal twoSignal = [RACSignal createSignal:^RACDisposable _Nullable(id _Nonnull subscriber) {
NSLog(@”请求模块二”);
[subscriber sendNext:@”数据二”];
return nil;
}];
// 监听两个模块执行完成
// 方法的参数必须与监听的信号一一对应
// 方法的参数就是每个信号发送的数据
[self rac_liftSelector:@selector(updateUI::) withSignalsFromArray:@[oneSignal, twoSignal]];

需要的方法updateUI::

(void)updateUI:(NSString )value1 :(NSString)value2 {
NSLog(@”%@, %@”, value1, value2);
NSLog(@”更新界面”);
}

打印日志如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值