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:@"哈喽啊"];    }