简介
简单的说,RAC就是一个第三方库,他可以大大简化你的代码过程。
官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。
RAC在某些特定情况下开发时可以大大简化代码,并且目前来看安全可靠。
RAC常见的类
RACSignal:信号类
//1.创建信号
/*
didSubScriber调用:只要一个信号被订阅就调用!
didSubScriber作用:利用subscriber 来发送数据!
didSubScriber能否执行,取决于信号是否被订阅
*/
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"Block被执行!");
//3.发送信号
[subscriber sendNext:@"Hello,LIYANJUN!"];
return nil;
}];
//2.订阅信号(热信号)
/*
nextBlock调用:只要订阅者发送数据、信号就会被调用
nextBlock作用:处理数据、展示UI
nextBlock是否被调用,取决于订阅者是否发送了信号
*/
[signal subscribeNext:^(id x) {
//x:信号发送的内容
NSLog(@"%@",x);
}];
执行过程
查看源码可以知道其执行过程如下
![](https://img.haomeiwen.com/i5157505/45890abaaa528baa.png)
RACDisposable:它是帮助我们取消订阅!
什么时候取消订阅
- 信号发送完毕;
- 信号发送失败;
1. 默认一个信号发送完毕后,就会主动取消订阅
2. 只有订阅者存在,就不会取消订阅
3. 可以手动取消订阅
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"Block被执行!");
//3.发送信号
[subscriber sendNext:@"Hello,LYJ!"];
self.subScriber = subscriber;//强引用,防止block执行完毕后释放,执行取消
return [RACDisposable disposableWithBlock:^{
//只有信号取消订阅,就会执行这里
NSLog(@"订阅被取消!");
}];
}];
RACDisposable *disposable = [signal subscribeNext:^(id x) {
//x:信号发送的内容
NSLog(@"%@",x);
}];
[disposable dispose];
RACSubject:信号提供者:自己可以充当信号,又能发送信号
//1.创建信号
RACSubject *subject = [RACSubject subject];
//2.订阅信号
//不同的信号,订阅方式不一样(因为类型不一样,所以调用方法不一样)
//RACSubject 处理订阅:拿到之前的_subScribers数组,保存订阅者
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"程序员“不高兴”同学,接收到祝福:%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"程序员“xXuTeng”同学,接收到祝福:%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"程序员“随遇而安”同学,接收到祝福:%@",x);
}];
//3.发送数据
//遍历出所有的数据,调用nextBlock
[subject sendNext:@"1024 程序员节快乐!身体健康!万事如意~~~~~"];
信息流
![](https://img.haomeiwen.com/i5157505/8f029707f08c9280.png)
RACReplaySubject
他是RACSubject的子类,RACReplaySubject可以先发送信号,再订阅信号;RACSubject就不可以。
//1.创建信号
RACReplaySubject *subject = [RACReplaySubject subject];
//3.发送信号
[subject sendNext:@"Hello"];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"12312314%@",x);
}];
他为什么可以提前发送信号,下图可以很好的解释。
在发送信号的时候,她会把数据保存一份,然后订阅信号的时候,她会遍历valuesReceived,只要有发送者,就发送数据
![](https://img.haomeiwen.com/i5157505/ff5d7d0124144a54.png)
网友评论