03-RAC之常见的宏以及其他的用法

1. RAC常见的宏

1.1 宏:RAC

作用:
某个对象某个属性绑定信号,一旦信号产生数据,就会将内容赋值给属性!

应用场景:
例如,监听textField的值,并把textField的值赋值给外部某个属性。

  • 常规的做法:

调用textfield的代理方法:

- (void)textFieldDidEndEditing:(UITextField *)textField; 
  • RAC的繁琐操作:

监听文本框的内容,创建信好

[_textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
       _label.text = x;
  }];
  • RAC的简单操作:

利用RAC这个宏,给对象的属性绑定一个信号,一旦有信号产生,就把信号里的数据赋值给这个对象的属性。

RAC(_label,text) = _textField.rac_textSignal;

解读:就是给_label这个控件的text属性,绑定一个_textField 文本内容变化的信号,当_textfield的文本内容变化时,便把文本的内容赋值给_label的text。

1.2 宏:RACObserve

作用:
给某个对象添加属性的监听,相当于kvo。

使用方法如下:

[RACObserve(self.label, text) subscribeNext:^(id  _Nullable x) {
     NSLog(@"%@",x);
 }];

解读如下:
当self.label里面的内容发生变化时,就会发送信号,并监听到。

2. RACMulticastConnection信号连接类

应用场景:

当发送一个信号,多处需要订阅时,如果用signal 直接调用subscribeNext的方法,那么订阅了几次,信号就会发送几次。
RACMulticastConnection这个类可以将多个信号连接起来订阅一次。

使用思路:

1.用RACSignal创建信号
2.信号调用publish,将信号转成连接类
3.用subscribeNext订阅连接类的信号
4.用connect将连接类连接起来

代码实现如下:

-(void)RACMulticastConnectionDemo{
    
    //不管订阅多少次信号,就只会请求一次数据
    //RACMulticastConnection:必须要有信号
    //1.创建信号
    RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        //发送网络请求
        NSLog(@"发送请求");
        //发送数据
        [subscriber sendNext:@"请求到的数据"];
        
        return nil;
    }];
    
    //2.将信号转成连接类!!
    RACMulticastConnection *connection = [signal publish];
    
    //3.订阅连接类的信号
    [connection.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"A处在处理数据%@",x);
    }];
    [connection.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"B处在处理数据%@",x);
    }];
    
    //4.连接
    [connection connect];
    
}

3.bind

代码简单使用如下:

   //1.创建信号
    RACSubject * subject = [RACSubject subject];
    //2.绑定信号
    RACSignal * bindSignal = [subject bind:^RACSignalBindBlock _Nonnull{
        return ^RACSignal * (id value, BOOL *stop){
            //block调用:只要源信号发送数据,就会调用bindBlock
            //block作用:处理原信号内容
            //value:源信号发送的内容
            NSLog(@"%@",value);
            //返回信号,不能传nil , 返回空信号 :[RACSignal empty]
            return [RACReturnSignal return:value];
        };
    }];
    
    //3.订阅信号
    [bindSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"绑定接收到!! %@",x);
    }];
    
    //4.发送
    [subject sendNext:@"发送原始的数据"];

4.RACCommand

  //1.创建命令
    RACCommand * command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        NSLog(@"%@",input);
        //input:指令
        //
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            //发送数据
            [subscriber sendNext:@"执行完命令之后产生的数据"];
            
            return nil;
        }];
    }];
    
    //2.执行命令
    RACSignal * signal = [command execute:@"输入的指令!!"];
    
    //3.订阅信号!
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

5. 获取最新的信号

    //创建多个信号
    RACSubject * signalOfSignal = [RACSubject subject];
    RACSubject * signal1 = [RACSubject subject];
    RACSubject * signal2 = [RACSubject subject];
    RACSubject * signal3 = [RACSubject subject];
    
    //订阅信号
    //    [signalOfSignal subscribeNext:^(id  _Nullable x) {
    //       [x subscribeNext:^(id  _Nullable x) {
    //           NSLog(@"%@",x);
    //       }];
    //    }];
    
    //switchToLatest :最新的信号!!
    [signalOfSignal.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    
    //发送信号
    [signalOfSignal sendNext:signal1];
    [signalOfSignal sendNext:signal2];
    [signalOfSignal sendNext:signal3];
    //发送数据
    [signal3 sendNext:@"3"];
    [signal2 sendNext:@"2"];
    [signal1 sendNext:@"1"];

因为最后发送信号的是,signal3,所以最新的信号时3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值