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

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 

@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 
#import 


@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 
#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的使用场景一)