作者菜鸟一枚,本篇文章仅作为个人笔记,其中包括个人对RAC的理解使用,仅做入门参考不作为正式教学,希望与各位共同进步
本篇文章使用ReactiveObjC,ReactiveSwift不做参考
假设你现在接手一个用RAC写的新项目,你当前面临的问题就是
如何使用RAC?
答:之前没有用过RAC,不知道怎么用(手动尴尬...)
那好,我们先搜索一波RAC的简单使用
这两篇文章都简单描述了RAC
在按钮,文本框,通知,KVO
中如何使用,你自己在Demo中运行也没有Bug,但是公司项目怎么弄,还是一脸懵逼(心里mmp一波...)
接下来我们怎么办???
难的看不懂,简单的感觉没压力,你想怎样...
当然是看一下这些简单例子怎么运行的
继续看个简单的,UIButton
是怎么结合RAC使用的
//先看第一句话
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
复制代码
OK, 懵懵懂懂好像知道了点什么
在
rac_signalForControlEvents
时RACcreateSignal
创建了一个信号,创建信号之后,信号里的block
被RACDynamicSignal
拷贝了一份,结合公司项目中简单的页面(不要说你公司项目都没看就来照我写的做???)
我们可以猜测,RAC的简单实现其实就是通过信号中block的创建、保存和转发来实现在不同类里做到不同类之间通信的功能
我写这篇文章的部分思路也有借鉴该博主,如有问题望及时联系
RAC是什么??
通过上一问以及引申出来的结论,我们可以大概说出RAC是用于iOS开发中的开发框架,通过RAC我们可以减少控制器的分担,将一些不必要的业务逻辑剥离出来,然后通过RAC实现不同类之间的数据传递和业务实现.
上面做一个简单总结,现在回到上一问题,既然RAC的实现是通过block的创建、保存和转发来实现,那么
信号是什么时候被创建、保存和转发的???
我们可以看看公司项目,或者自己想一下
然后可以发现,信号的创建是在VM中进行的懒加载,也就是当你想发送信号的时候此时就可以进行了信号的创建和发送,接下来我们来做一个真正意义上的View之间跨类通信
附上一个小小小小小小小小(真的最小了)RAC+MVVM
- (void)viewDidLoad {
[super viewDidLoad];
ChangeLabel *label = [[ChangeLabel alloc] initWithFrame:CGRectMake(50, 200, 300, 50)];
label.viewModel = self.viewModel;
[self.view addSubview:label];
ChangeBtn *btn = [[ChangeBtn alloc] initWithFrame:CGRectMake(150, 100, 150, 60)];
btn.viewModel = self.viewModel;
[self.view addSubview:btn];
}
- (ChangeViewModel *)viewModel{
if (!_viewModel) {
_viewModel = [ChangeViewModel new];
}
return _viewModel;
}
复制代码
controller中没有业务逻辑,仅进行了view的VM绑定,通过同一个VM在VM中实现业务处理以及业务分发
//button
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor redColor];
[self setTitle:@"我要修改Label" forState:UIControlStateNormal];
//RAC在button中的使用
//RAC中一定要写上 @weakify(self)和@strongify(self)
@weakify(self)
[[self rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
@strongify(self)
//发送信号
[self.viewModel.changeSubject sendNext:@"我的地盘听我的"];
}];
// [self addTarget:self action:@selector(changeLabel) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
- (void)changeLabel{
//调用信号
[self.viewModel.changeSubject sendNext:@"我的地盘就得听我的"];
}
- (void)setViewModel:(ChangeViewModel *)viewModel{
_viewModel = viewModel;
}
//*****************分割线********************
//label
- (void)setViewModel:(ChangeViewModel *)viewModel{
_viewModel = viewModel;
@weakify(self)
//订阅信号(我理解的是执行信号)
[viewModel.changeSubject subscribeNext:^(NSString *x) {
@strongify(self)
self.text = x;
}];
}
复制代码
View层做为信号发送者和订阅者发送、处理信号
//初始化信号
- (RACSubject *)changeSubject{
if (!_changeSubject) {
_changeSubject = [RACSubject subject];
}
return _changeSubject;
}
复制代码
VM层作为信号的初始化和逻辑处理(比如model的赋值等)
刚了解RAC没有几天,由于之前记得笔记放公司忘记带家,所以本篇文章很小,勿怪勿怪,有时间还会加些东西
Demo很渣,本人太菜,大佬勿喷,以后还会进步
这篇文章算不上真正的RAC使用教学,我想通过这篇文章来分享我对一个东西从陌生到熟悉的过程,RAC只是成为了这篇文章的契机