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
网友评论