iOS-RAC 学习笔记

RAC简介

  • 在RAC中,万物皆信号。
  • RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够通过信号提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC(OC) 和 ReactiveSwift(swift),官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。。
  • 团队协作时,必须注意一个点,对于很熟悉RAC的人来说,使用RAC是非常方便的。但对于不熟悉RAC的人来说,由于RAC的可阅读性是很差的,所以需耗费大量时间阅读和学习。
  • 未避免循环引用,需使用@weakify(self),@strongify(self)。这两个宏至少是一对出现的
  • RAC就是一个第三方库,他可以大大简化你的代码过程。

RAC架构框架图


iOS-RAC 学习笔记_第1张图片
RAC架构框架图
iOS-RAC 学习笔记_第2张图片
信号流程

一 、使用

老规矩,pod install

pod 'ReactiveObjC', '~> 3.0.0' //建议纯oc代码使用ReactiveObjC

1、基本控件

  • UITextField
//监听文本输入
[[_textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
}];
//可根据自己想要监听的事件选择
[[_textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"%@",x);
    }];
//添加条件 --  下面表示输入文字长度 > 10 时才会调用subscribeNext
[[_textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) { 
    return value.length > 10;
}] subscribeNext:^(NSString * _Nullable x) {
     NSLog(@"输入框内容:%@", x);
}];
  • UIButton
   //监听按钮点击事件
  [[View.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"-->%@",x);
    }];

//这种不建议使用,暂时不知道didBtnAction方法不写会报警高~不过可以也实现
//    [[View.btn rac_signalForSelector:@selector(didBtnAction:)]subscribeNext:^(id x) {
//       NSLog(@"-->%@",x);
//    } completed:^{
//    }];

rac 类似代理传值例子

 //第一
@property (strong,nonatomic) RACSubject *btnSubject;

//第二,在View点m,按钮点击方法里面 
    // view里面带有btn,点击的时候 

- (void)didBtnAction:(UIButton *)btn{
    SWLog(@"回到控制器后g要干嘛?");
   
    [self.btnSubject sendNext:@{@"text":@"这边可以携带参数"}];
    
}

- (RACSubject *)btnSubject{
    if (!_btnSubject) {
        _btnSubject = [RACSubject subject];
    }
    return _btnSubject;
}

//控制器外部调用
    [View.btnSubject subscribeNext:^(id x) {
        SWLog(@"收到!==%@",x);
       // log==> @{@"text":@"这边可以携带参数"}
    } completed:^{
        
    }];
  • 计时器(interval、delay)

    /*
     声明:RACDisposable *disposable
     创建一个RACDisposable,调用disposable方法等时候就会进入创建对象的block,把定时器释放掉
     这两个宏就是为了解决循环引用的,且必须配套使用。
     @weakify(self)
     @strongify(self)
     
     相当于下面:
     __weak typeof(self) weakSelf = self;
     __strong typeof(weakSelf) strongSelf = weakSelf;
     */
    

//类似timer
@weakify(self)
self.disposable = [[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
        @strongify(self)
        NSLog(@"时间:%@", x); // x 是当前的时间
        //关闭计时器
        [self.disposable dispose];
}];
//延时
[[[RACSignal createSignal:^RACDisposable *(id subscriber) {
        [subscriber sendNext:@"延时2秒"];
        return nil;
    }] delay:2] subscribeNext:^(id x) {
        
        NSLog(@"-->%@",x);
    }];

2.KVO 属性监听

//方法一
[_redView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
       NSLog(@"方法一 %@",value);
}];
//方法二
[[_redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id  _Nullable x) {
        NSLog(@"方法二 %@",x);
}];
//方法三 宏写法
[RACObserve(_redView, frame) subscribeNext:^(id  _Nullable x) {
        NSLog(@"方法三%@",x);
    }];

3.textField监听,lable赋值,手势

//此处RAC宏相当于让_label订阅了_textField的文本变化信号
//赋值给label的text属性
RAC(_label, text) = _textField.rac_textSignal;

 //快速添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
    [[tap rac_gestureSignal] subscribeNext:^(id x) {
    } completed:^{
    }];
    [newTextLable addGestureRecognizer:tap];

//输入框监听
[[self.textFild rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

4.监听 Notification 通知事件

    //通知常用
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"通知名字" object:nil]subscribeNext:^(id x) {
        
    } completed:^{
        
    }];

5.多个订阅 RACMulticastConnection

- (void)sss{
    
    RACSignal *signal=[RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        [subscriber sendNext:@"123444"];
        return nil;
    }];
    RACMulticastConnection *mut = [signal publish];
    [mut.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    [mut.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"22%@",x);
    }];
    [mut connect];
}

6.绑定信号 bind

- (void)text{
  RACSubject *signal = [RACSubject subject];
  [[signal bind:^RACStreamBindBlock _Nonnull{
     return ^RACSignal *(id value, BOOL* stop){
         NSLog(@"%@",value);
          NSString *v = [NSString stringWithFormat:@"处理过的数据%@",value];
          return [RACReturnSignal return:v];//需要导入头文件#import "RACReturnSignal.h"
        };
  }] subscribeNext:^(id  _Nullable x) {
     NSLog(@"%@",x);
    }];
    [signal sendNext:@"1111"];
    //输出
    //1111
    //处理过的数据1111

}

7.映射

  - (void)text{  
    //映射
    RACSubject *subject = [RACSubject subject];
    [[subject map:^id _Nullable(id  _Nullable value) {
        return [NSString stringWithFormat:@"处理过的数据%@",value];
        
    }] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    } ];
    [subject sendNext:@"11"];
    
    //输出
    //处理过的数据11
}

8.忽略 ignore

- (void)text2{
    RACSubject * subject = [RACSubject subject];
    [[subject ignore:@"a"] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"a"];
    [subject sendNext:@"b"];
    [subject sendNext:@"c"];
    
    
    //输出log
//    2019-03-07 14:35:00.348048+0800 MVVM+RAC[10199:763418] b
//    2019-03-07 14:35:00.348200+0800 MVVM+RAC[10199:763418] c
}

总结 使用时一时爽~,维护时mmp 哈哈哈,为了你的同事,还是稳着~ 如果这篇文章对你有用,给个star

你可能感兴趣的:(iOS-RAC 学习笔记)