RAC的使用心得

作者菜鸟一枚,本篇文章仅作为个人笔记,其中包括个人对RAC的理解使用,仅做入门参考不作为正式教学,希望与各位共同进步

本篇文章使用ReactiveObjC,ReactiveSwift不做参考

假设你现在接手一个用RAC写的新项目,你当前面临的问题就是

如何使用RAC?

答:之前没有用过RAC,不知道怎么用(手动尴尬...)

那好,我们先搜索一波RAC的简单使用

RAC的简单配置和使用

iOS 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创建了一个信号,创建信号之后,信号里的blockRACDynamicSignal拷贝了一份,结合公司项目中简单的页面(不要说你公司项目都没看就来照我写的做???)

我们可以猜测,RAC的简单实现其实就是通过信号中block的创建、保存和转发来实现在不同类里做到不同类之间通信的功能

之前学习RAC时参考的一篇文章

我写这篇文章的部分思路也有借鉴该博主,如有问题望及时联系


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只是成为了这篇文章的契机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值