ReactiveCocoa常用类练习
来源:互联网 发布:linux快捷键 编辑:程序博客网 时间:2024/05/17 02:21
#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:@"哈喽啊"]; }
阅读全文
0 0
- ReactiveCocoa常用类练习
- ReactiveCocoa常用集合类练习
- ReactiveCocoa常见用法练习
- ReactiveCocoa常用操作方法
- 常用类的练习
- 常用类练习
- 常用类练习
- 常用类练习提
- 常用类_练习
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- ReactiveCocoa
- shiro 简介
- awk打开多个文件的方法
- fetch = FetchType.EAGER
- 使用dig名令获得DNS报文
- Logger的使用
- ReactiveCocoa常用类练习
- 从输入URL到页面展示
- LINUX驱动之SPI子系统之四spi_master的注册流程
- 鸟哥的LINUX私房菜第一章 学习笔记
- CSS层叠样式表基本样式的位置
- python 字典 方法
- linux 下NANS flash驱动编写
- 反射_案例1_读文件流
- HDFS基本命令