iOS开发RAC中retry、replay、throttle的使

2022-08-02  本文已影响0人  心成则玲

首先解释一下这三个关键字在rac中的作用:
retry:重试,只要失败就会重新执行创建信号中的block,直到成功为止
replay:重放,当一个信号被多次订阅,反复播放其内容
throttle:节流,当某个信号发送比较频繁时,可以使用节流,在某一时间段不发送信号内容,过段时间后获取信号的最新发出内容(比如搜索框频繁发送请求,按钮避免重复点击)

retry

__block NSInteger i = 0;
RACSignal *retrySignal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        if (i == 3) {
            [subscriber sendNext:[NSString stringWithFormat:@"发送成功:%@",@(i)]];
        } else {
            NSLog(@"发送错误信息:%@",@(i));
            NSError *error = nil;
            [subscriber sendError:error];
        }
        i++;
        return nil;
    }] retry];
[retrySignal subscribeNext:^(id x) {
        //当接收到信号后,发送就会停止
        NSLog(@"%@",x);
    } error:^(NSError *error) {
        
    }];

replay

 __block NSInteger i = 1;
    RACSignal *testSignal = [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@(i)];
        i ++;
        return nil;
    }]replay];
    
    [testSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"第一个订阅者:%@",x);
    }];
    
    [testSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"第二个订阅者:%@",x);
    }];

注:不执行replay输出结果为:第一个订阅者:1,第二个订阅者:2
使用replay输出结果为:第一个订阅者:1,第二个订阅者:1

throttle

UITextField *textfield;
 [[[textfield rac_textSignal] throttle:1] subscribeNext:^(id x) {
      NSLog(@"开始搜索请求==%@", x);
  }];

注:指定时间间隔内,不再发送信号 这里添加 throttle, 表示在 1 秒内 text 没有改变时,才会进行搜索请求

上一篇 下一篇

猜你喜欢

热点阅读