这里写RAC常见的应用场景
- RAC集合
- 代替KVO
- 监听事件
- 代替通知
- 监听文本框
5.代理
RAC集合
RACTuple
RACTuple是rac定义的集合,跟数组类似,
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"aaaa",@"bb",@123,@23434]];
NSString *str = tuple[0];
NSLog(@"%@",str);
RAC解析数据
- RACSequence 用于代替NSArray,NSDictionary 可以使用快速遍历
- 数据解析 最常见的应用场景:字典转模型
解析数组
//数组
NSArray *arr = @[@"abc",@"bbb",@123];
//RAC集合 将数组中的元素作为发送信号的内容
[arr.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
解析字典
//字典
NSDictionary *dict = @{@"name":@"LYJ",@"age":@"18"};
//字典转为集合
[dict.rac_sequence.signal subscribeNext:^(RACTuple * x){
//NSLog(@"%@",x);
/*
NSString *key = x[0];//返回的第一个是key
NSString *value = x[1];返回的值是value
NSLog(@"key = %@,value = %@",key,value);
*/
//解析元祖: RACTupleUnpack(<#...#>)定义的一个宏
RACTupleUnpack(NSString * key,NSString * value) = x;
NSLog(@"%@ : %@",key,value);
}];
代替kvo
[_redView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionOld observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
//回调
//监听到的时候,做出的改变!
NSLog(@"value==%@-%@",value,change);
}];
3 监听事件
[[_btn rac_signalForControlEvents:(UIControlEventTouchUpInside)]subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"按钮被点击");
}];
4 代替通知
#import "NSObject+RACKVOWrapper.h"
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardWillShowNotification object:nil]subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"键盘调取!");
}];
5 监听文本框
[_textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
6.代替代理
//这里订阅收到的是一个x,当一个页面存在多个tableview时,我们可以对x进行判断看是哪个tableview
[[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate) ] subscribeNext:^(RACTuple * x) {
NSLog(@"点击了");
NSLog(@"%@,%@",x.first,x.second);
}];
//这样子不带协议是无法代替代理的,虽然能达到效果,这个方法表示某个selector被调用时执行一段代码.带有协议参数的表示该selector实现了某个协议,所以可以用它来实现Delegate。
// [[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:)] subscribeNext:^(RACTuple* x) {
// NSLog(@"%@",[x class]);
// NSLog(@"%@",x);
// }];
//这里是个坑,必须将代理最后设置,否则信号是无法订阅到的
//在设置代理的时候,系统会缓存这个代理对象实现了哪些代码方法
//如果将代理放在订阅信号前设置,那么当控制器成为代理时是无法缓存这个代理对象实现了哪些代码方法的
tableview.delegate = self;