RAC的基本使用

RAC其实可以帮我们做的事情很多很多,而且也很简单,并且代码和流水线一样这样下来也很好的阅读,能把业务逻辑放到一块进行处理,接下来就来简单的介绍下

这里使用的版本是ReactiveObjC 3.0.0的版本

1、代替代理,比如说我们想让按钮的点击事件本来在A.m中做的处理,想要在B.m中收到,其实我们用代理,当然用了RAC的时候就会更加简单,就比如说blueView里面

有button,然后button的点击事件是在blueView这个类中的,但是我们在控制器中也能知道这个什么时候被点击,我们也可以做出自己的处理,其中RACTuple就是一个元组里面装着参数。其实rac_signalForSelector 这个其实就是创建一个信号去监听调用者的某个方法的调用。

[[_blueView rac_signalForSelector:@selector(send:)]subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"send方法被调用");
    }];

2、代替KVO,我们需要先去导入一个头文件

#import <NSObject+RACKVOWrapper.h>
之后我们再去使用,只要bluewView的frame发生改变就会去调用下面额block里面的内容,这样不用添加observer,而且直接在下面就可以进行回调,如果不是这样其实我们如果还要监听其他变量的属性,都是要走系统的那个回调方法,这样要做很多判断会很复杂。这就是这个框架的好处

[_blueView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionOld observer:nil block:^(id value, NSDictionary *change, 
 BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
        NSLog(@"%@",change[NSKeyValueChangeOldKey]);
    }];
当然还有种方式,就是把监听属性的变化变成信号,如果只要值发生变化就会去发送这个信号

 [[_blueView rac_valuesForKeyPath:@"frame" observer:nil]subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
3、监听事件,就比如说按钮的点击事件
//其实就是将点击事件转换成信号
     [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"%@",x);
    }];
4、代替通知,其中x就是NSNotification

[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardWillShowNotification object:nil]subscribeNext:^
(NSNotification * _Nullable x) {
        NSLog(@"%@",x);
    }];
5、有的时候可能我们需要接收到多条发送请求才去做一些处理,那么我们可以这么使用,其中signal2中的subscriber保存在属性中,之后再去发送消息,里面的数组就是用来存放信号的,当数组中的所有的信号都发送了数据之后才会去执行@selector包装的方法,这个方法的参数必须是要和数组当中的信号一一对应起来,也就是每一个信号发送的数据
  RACSignal * signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        [subscriber sendNext:@"第一条"];
        
        return nil;
    }];
    
    RACSignal * signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        self.subscriber=subscriber;
        return nil;
    }];
    
    [self rac_liftSelector:@selector(test:string2:) withSignalsFromArray:@[signal1,signal2]];
    
   
}
-(void)test:(NSString *)string1 string2:(NSString *)string2
{
    NSLog(@"%@-----%@",string1,string2);
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.subscriber sendNext:@"第二条消息"];
}

6、RAC中的宏,可以让前面的文本框的变化响应后面的变化,也就是是给某个对象的某个属性去绑定信号,只要这个信号有发送了数据,就会把数据给这个属性。

 RAC(self.textField1,text) = _textField.rac_textSignal;


7、利用宏监听某个属性的变化,只要这个属性发送了变化,那么就去信号就去发送数据

 //首先返回值是一个信号类,然后之后去订阅这个信号 
 [RACObserve(self.textField1, text) subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
8、将数据包装能元组

    RACTuple *tuple = RACTuplePack(@"sdas",@"sdasa");
    
    NSLog(@"%@---%@",tuple.first,tuple.second);
9、@weakify(Obj)和@strongify(Obj),这两个都是配套着使用,解决循环引用的问题

10、对元组解包,括号里面的参数是相对应与元组里面的数据的

 
    RACTupleUnpack(NSString *string1, NSString *string2) = tuple;
    NSLog(@"%@,%@",string1,string2);

11、把两个信号组合起来同时订阅,把两个信号组合成元组发出,举个例子我们可以同时的监听到两个textField的变化,

 [[RACSignal combineLatest:@[_textField.rac_textSignal,_textField1.rac_textSignal]]subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"%@",x);
    }];
textField的显示以及下面的打印

12、还有一种方式也是把信号先组合起来,然后再聚合,我们订阅信号得到的内容由我们自己去决定,下面的reduce中括号里面的name和password分别对应的是前面的信号发出的内容,返回值就是我们订阅时能得到的内容

[[RACSignal combineLatest:@[_textField.rac_textSignal,_textField1.rac_textSignal] reduce:^id _Nullable(NSString * name,NSString 
* password){
       
        return @"sadas";
    }]subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值