美文网首页
RAC使用补充

RAC使用补充

作者: heart_领 | 来源:发表于2018-09-13 09:18 被阅读0次

    1、distinctUntilChanged:两次信号不同,才会订阅到。

    [[[self.textFild rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];   
    

    2、throttle:截流

    [[[self.textField rac_textSignal] throttle:1] subscribeNext:^(id x) {
                NSLog(@"%@", x);//超过1秒textField的值,只要不变,就会订阅到,1秒内如果值一直在变,就订阅不到,即两次输入值的间隔不超过1秒,就不会订阅到,两次输入值的间隔超过1秒,就会订阅到
            }];
        
        [[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"1"];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [subscriber sendNext:@"2"];
                [subscriber sendNext:@"3"];
                [subscriber sendNext:@"4"];
            });
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [subscriber sendNext:@"5"];
                [subscriber sendNext:@"6"];
            });
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [subscriber sendNext:@"7"];
            });
            return nil;
        }] throttle:1] subscribeNext:^(id x) {
            NSLog(@"输出:%@",x);//输出:1,4,6,7
        }];
    //    当某个信号发送比较频繁时,可以使用节流,在某一段时间不发送信号内容,过了一段时间获取信号的最新内容发出。
    

    3、ReplaySubject - 手动回放控制信号 - RACReplaySubject
    表示可以手动控制信号,底层实现和RACSubject不一样,它会先把值保存起来,然后遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock然后调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock。
    可以有以下两种处理流程:

     处理流程 1:创建信号-订阅信号-发送信号(和Subjects一样)
     处理流程 2:创建信号-发送信号-订阅信号
     RACReplaySubject可以先发送信号,在订阅信号,RACSubject就不可以
     使用场景一:如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类。
     使用场景二:可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值。
    
    // 1.创建信号
    //        第一种情况
    //        RACReplaySubject *replaySubject = [RACReplaySubject subject];
    //        第二种情况 只缓存最新的一个
    //        RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:1];
    //    RACSubject *replaySubject = [RACSubject subject];
    //        // 2.发送信号
            [replaySubject sendNext:@"1"];
            [replaySubject sendNext:@"2"];
    //    //    订阅  几次接收几次
    //        // 3.订阅信号 First
            [replaySubject subscribeNext:^(id x) {
                NSLog(@"FirstSubscribeNext%@",x);
            }];
    //        // 3.订阅信号 Second
            [replaySubject subscribeNext:^(id x) {
                NSLog(@"SecondSubscribeNext%@",x);
            }];
        
    //    [replaySubject sendNext:@"1"];
    //    [replaySubject sendNext:@"2"];
    

    4、startWith:占位

    刚开始用 da引导页4.png 四秒种后用da引导页2.png
      RAC(self.img,image) = [[[RACSignal return:[UIImage imageNamed:@"da引导页2.png"]] delay:4] startWith:[UIImage imageNamed:@"da引导页4.png"]];
    

    5、takeWhileBlock:返回YES可以订阅到,返回NO订阅不到。 skipWhileBlock:返回YES跳过不可以订阅到,返回NO没有跳过可以订阅到 skipUntilBlock:返回YES跳过不可以订阅到,返回NO没有跳过可以订阅到 repeatWhileBlock

    RACSignal *signal = [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            NSLog(@"今天天气很好");
            //        sleep(2);
            [subscriber sendNext:@"开心每一天"];
            [subscriber sendCompleted];
    //                [subscriber sendError:[NSError errorWithDomain:NSURLErrorDomain code:1000 userInfo:nil]];
            [subscriber sendNext:@"哈哈哈哈哈哈哈"];
    //        [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                
                NSLog(@"销毁");
            }];
        }] skipUntilBlock:^BOOL(id  _Nullable x) {
            NSLog(@"skipUntilBlock:%@",x);
            
            return YES;
        }];
    //    [signal subscribeNext:^(id  _Nullable x) {
    //        NSLog(@"%@",x);
    //    }];
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        } error:^(NSError * _Nullable error) {
            NSLog(@"发送失败");
        } completed:^{
            NSLog(@"发送成功");
        }];
    

    6、

    相关文章

      网友评论

          本文标题:RAC使用补充

          本文链接:https://www.haomeiwen.com/subject/ujbdiftx.html