#pragma mark - RAC Text
- (void)RACMethod {
/*************************************************************************************
1⃣️.RACSignal信号类
操作步骤:
创建信号(冷信号)-->订阅信号(热信号)-->发送数据
RACSignal:表示有数据传输的时候
RACDisposable:取消订阅信号
RACSubscriber:订阅者,发送数据
*************************************************************************************/
// 1.创建信号
RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 在信号被订阅的时候会调用
// 作用是在这里面传输数据
// 3.发送数据
[subscriber sendNext:@"我是第1个信号"];
return nil;
}];
// 2.订阅信号(x就是传输的数据)
[signal1 subscribeNext:^(id _Nullable x) {
// 在信号内部发送数据的时候会调用,并且会把值传输给你
// 作用是处理数据
NSLog(@"%@",x);
}];
NSLog(@"===================");
/************************************************************************************
2⃣️.RACDisposable:取消订阅或者清理对象
只要订阅者一直在,就表示需要订阅信号,信号就不会自动被取消订阅,所以当我们不需要的时候,需要手动取消订阅
*************************************************************************************/
RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"我是第2个信号"];
return [RACDisposable disposableWithBlock:^{
//当信号取消定订阅的时候调用
NSLog(@"呜呜呜~我要被取消订阅了");
}];
}];
RACDisposable *disposable1 = [signal2 subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//取消订阅(主动取消)
[disposable1 dispose];
NSLog(@"===================");
/*************************************************************************************
3⃣️.RACSubject:信号提供者
信号提供者既可以充当信号,也可以充当订阅者,发送数据;
一个信号允许被多次订阅
*************************************************************************************/
// 创建信号
RACSubject *subject = [RACSubject subject];
// 订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"第一个订阅者:%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"第二个订阅者:%@",x);
}];
//发送信号
[subject sendNext:@"RAC"];
NSLog(@"===================");
/*************************************************************************************
4⃣️.RACReplaySubject:重复信号的提供类,它是RACSubject的子类。
RAC允许先发送信号,再订阅信号。RACReplaySubject就是一个重复信号的提供者
*************************************************************************************/
// 创建信号
RACReplaySubject *relpaySubject = [RACReplaySubject subject];
// 发送信号-会把所有发送的数据保存到数组中,然后遍历所有的订阅者,分别调用nextBlock
[relpaySubject sendNext:@"R"];
[relpaySubject sendNext:@"A"];
[relpaySubject sendNext:@"C"];
// 订阅信号
[relpaySubject subscribeNext:^(id _Nullable x) {
NSLog(@"第1个订阅者:%@",x);
}];
[relpaySubject subscribeNext:^(id _Nullable x) {
NSLog(@"第2个订阅者:%@",x);
}];
NSLog(@"===================");
/*************************************************************************************
5⃣️.RACMulticastConnection
RACMulticastConnection用于当一个信号被多次订阅时,为了保证创建信号时多次调用创建信号中的block造成副作用;
这样下来一个信号即使被订阅多次,也只是发送一次请求;
用于信号中请求数据,避免多次请求数据
*************************************************************************************/
// 创建信号
RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 发送信号
[subscriber sendNext:@"网络数据"];
return nil;
}];
// 把信号转换为连接类
RACMulticastConnection *connection = [signal3 publish];
// 订阅连接类的信号(注意:是连接类的信号,不再是原来的信号类),这样只会调用一次创建信号时的block
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[connection.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
// 连接
[connection connect];
NSLog(@"===================");
/*************************************************************************************
6⃣️.RACCommand用于处理事件:
RACCommand是RAC中用于处理事件的类,可以把怎么处理事件,事件中的数据如何传递包装到这个类中;
它可以很方便的监控事件的执行过程(监听按钮点击、网络请求);
RACCommand使用时内部不允许传入一个nil的信号;
使用步骤:创建命令->执行命令;
*************************************************************************************/
// 1.创建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
// SignalBlock在命令一执行就会调用,为了处理事件
NSLog(@"%@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"didSubscribe");
// 执行命令的过程中就会调用,用于传输数据
//订阅者subscriber-->[RACReplaySubject subject]
[subscriber sendNext:@"我发送数据啦~"];
return nil;
}];
}];
// 2.执行命令(会调用signalBlock)
RACReplaySubject *replaySubject2 = (RACReplaySubject *)[command execute:@"执行命令"];
// 3.获取命令中产生的数据,订阅信号
[replaySubject2 subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
NSLog(@"===================");
/**************************************************************************************
7⃣️.switchToLatest用法
switchToLatest:只能用于signalOfSignals
作用:就是拿到signalOfSignals发出的最新信号
**************************************************************************************/
// 实例一
// 1.创建一个信号中的信号,只能发送信号
RACSubject *signalOfSignal = [RACSubject subject];
//创建信号,发送普通数据
RACSubject *signalA = [RACSubject subject];
RACSubject *signalB = [RACSubject subject];
// 2.订阅信号中的信号,拿到signal发出值
// 获取信号中的信号发送最新信号
[signalOfSignal.switchToLatest subscribeNext:^(id _Nullable x) {
// 只会输出最后发送的数据
NSLog(@"%@",x);
}];
// 3.发送信号
[signalOfSignal sendNext:signalA];
[signalOfSignal sendNext:signalB];
// 信号发送数据
[signalA sendNext:@"发送普通数据1"];
[signalB sendNext:@"发送普通数据2"];
NSLog(@"===================");
// 实例二
// 创建命令
RACCommand *command2 = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
// 1.当执行命令的时候会调用SignalBlock,在这里可以处理网络请求
NSLog(@"***%@",input);
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 2.执行完SignalBlock,接着就会调用下面
// 传送数据
[subscriber sendNext:@"请求到的网络数据"];
// 当数据传输完成,命令就执行完成
[subscriber sendCompleted];
return nil;
}];
}];
// 直接获取命令中新发出信号
[command2.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
// 订阅当前命令执行状态的信号(正在执行/没有执行)
[command2.executing subscribeNext:^(NSNumber * _Nullable x) {
//x=YES(正在执行) x=NO(没有执行/执行完成)
//每次状态改变的时候会调用
if ([x boolValue] == YES)
{
NSLog(@"正在执行");
}
else if ([x boolValue] == NO)
{
NSLog(@"没有执行或者已经执行完成");
}
}];
// 2.执行命令
[command2 execute:@"哈喽啊"];
}
ReactiveCocoa常用类练习
最新推荐文章于 2022-03-25 11:58:03 发布