美文网首页
RAC框架源码解析之RACSubject的使用场景一

RAC框架源码解析之RACSubject的使用场景一

作者: Jimi | 来源:发表于2018-04-20 15:00 被阅读15次

    1、RACSubject的运用场景

    前面说到RACSubject既能 订阅信号 又能 发送信号 ,RAC可以代替我们的 KVO、代理、通知 等,下面我们来看一下RAC是如何代替我们的 KVO、代理、通知 的。

    首先我们先来创建一个自定义的View JMView 并创建一个按钮,当我们点击按钮的时候如何通知控制器?在没用ARC之前可能会有人把按钮弄成全局变量放到.h中,但是这样就暴露了按钮,这么做显然是不合理的。还有就是用代理、block、通知等方式来做,今天我们就看看用RAC是如何通知控制器的。

    
    --------------------------- JMView.h---------------------------
    //
    //  JMView.h
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/20.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface JMView : UIView
    
    @end
    
    --------------------------- JMView.m ---------------------------
    //
    //  JMView.m
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/20.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import "JMView.h"
    
    @interface JMView()
    
    @end
    
    @implementation JMView
    
    - (instancetype)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            self.backgroundColor = [UIColor orangeColor];
            
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.frame = CGRectMake(10, 10, 100, 60);
            [btn setTitle:@"我是按钮" forState:UIControlStateNormal];
            btn.backgroundColor = [UIColor redColor];
            [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            btn [addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
            [self addSubview:btn];
        }
        return self;
    }
    
    #pragma mark - 按钮点击事件
    - (void)btnClick {
        
    }
    
    @end
    
    

    当按钮点击想通知控制器的时候,首先在.h文件中创建一个按钮点击信号属性,在 .m 中懒加载按钮点击信号,当点击按钮的时候把信号发送出来,在控制器中订阅信号就能接收到按钮的点击事件了,代码如下:

    --------------------------- JMView.h---------------------------
    //
    //  JMView.h
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/20.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    #import <ReactiveObjC/ReactiveObjC.h>
    
    
    @interface JMView : UIView
    
    /** 按钮点击信号属性 */
    @property (nonatomic, strong) RACSubject *btnClickSignal;
    
    @end
    
    --------------------------- JMView.m---------------------------
    //
    //  JMView.m
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/20.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import "JMView.h"
    
    @interface JMView()
    
    @end
    
    @implementation JMView
    
    - (RACSubject *)btnClickSignal {
        if (!_btnClickSignal) {
            _btnClickSignal = [RACSubject subject];
        }
        return _btnClickSignal;
    }
    
    - (instancetype)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            self.backgroundColor = [UIColor orangeColor];
            
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.frame = CGRectMake(10, 10, 100, 60);
            [btn setTitle:@"我是按钮" forState:UIControlStateNormal];
            btn.backgroundColor = [UIColor redColor];
            [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
            [self addSubview:btn];
        }
        return self;
    }
    
    #pragma mark - 按钮点击事件
    - (void)btnClick {
        [self.btnClickSignal sendNext:@"随便传个啥都行啦"];
    }
    
    @end
    
    --------------------------- 控制器 ---------------------------
    //
    //  ViewController.m
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/19.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <ReactiveObjC/ReactiveObjC.h>
    #import "JMView.h"
    
    @interface ViewController ()
    
    /** JMView */
    @property (nonatomic, strong) JMView *jm_View;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.jm_View = [[JMView alloc] initWithFrame:CGRectMake(10, 100, 300, 100)];
        [self.jm_View.btnClickSignal subscribeNext:^(id  _Nullable x) {
            NSLog(@"这里打印了按钮的点击事件了哦 %@", x);
        }];
        [self.view addSubview:self.jm_View];
        
        
    }
    
    @end
    
    

    demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo

    联系我:
    qq: 1245424073
    微信: liujunmin6980

    相关文章

      网友评论

          本文标题:RAC框架源码解析之RACSubject的使用场景一

          本文链接:https://www.haomeiwen.com/subject/aqoakftx.html