RAC的常见应用场景

这里写RAC常见的应用场景
1. RAC集合
2. 代替KVO
1. 监听事件
3. 代替通知
4. 监听文本框
5.代理

RAC集合

RACTuple

RACTuple是rac定义的集合,跟数组类似,

    RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"aaaa",@"bb",@123,@23434]];

    NSString *str = tuple[0];
    NSLog(@"%@",str);

RAC解析数据

  1. RACSequence 用于代替NSArray,NSDictionary 可以使用快速遍历
  2. 数据解析 最常见的应用场景:字典转模型

解析数组

    //数组
    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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值