RAC使用补充

2018-09-13  本文已影响0人  heart_领

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、

上一篇下一篇

猜你喜欢

热点阅读