iOS开发「RAC」RAC中的重复操作方法retry、replay、throttle

  • retry \color{OrangeRed}{重试}:只要失败,就会重新执行创建信号中的block,直到成功 \color{DodgerBlue}{必须要拿到成功结果的就可以try 一 try了}
  • replay \color{OrangeRed}{重放}:当一个信号被多次订阅,反复播放内容
  • throttle \color{OrangeRed}{节流}:当某个信号发送比较频繁时,可以使用节流,在某一段时间不发送信号内容,过一段时间后获取信号的最新发出内容(有点儿类似于delay: 延迟发送,但这个throttle相当于是延迟接收)

retry

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //retry重试 :只要失败,就会重新执行创建信号中的block,直到信号发送成功.
        __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) {
        
    }];
}

执行结果:

--TIME:15:15:14.287000+0800【FILE:MyIntegralInfoVc.m--LINE:35】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
发送错误信息:0
--TIME:15:15:14.379000+0800【FILE:MyIntegralInfoVc.m--LINE:35】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
发送错误信息:1
--TIME:15:15:14.381000+0800【FILE:MyIntegralInfoVc.m--LINE:35】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
发送错误信息:2
--TIME:15:15:14.382000+0800【FILE:MyIntegralInfoVc.m--LINE:45】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
发送成功:3

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的输出结果:

--TIME:15:43:55.106000+0800【FILE:MyIntegralInfoVc.m--LINE:40】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
第一个订阅者:1
--TIME:15:43:55.107000+0800【FILE:MyIntegralInfoVc.m--LINE:44】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke_2
第二个订阅者:2

执行replay的输出结果:(当信号被多次订阅,反复播放内容,就是都给你重头来)

--TIME:15:50:41.695000+0800【FILE:MyIntegralInfoVc.m--LINE:40】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke
第一个订阅者:1
--TIME:15:50:41.696000+0800【FILE:MyIntegralInfoVc.m--LINE:44】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke_2
第二个订阅者:1

throttle

NSLog(@"开始创建信号");
    RACSignal *testSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@"信号被发送"];
        return nil;
    }];
    
    [[testSignal throttle:2.f] subscribeNext:^(id  _Nullable x) {
        NSLog(@"接收到的啥:%@",x);
    }];

执行结果:

--TIME:16:06:47.061000+0800【FILE:MyIntegralInfoVc.m--LINE:30】FUNCTION:-[MyIntegralInfoVc viewDidLoad]
开始创建信号
--TIME:16:06:49.062000+0800【FILE:MyIntegralInfoVc.m--LINE:37】FUNCTION:-[MyIntegralInfoVc viewDidLoad]_block_invoke_2
接收到的啥:信号被发送
//从执行结果来看,从信号发送到监听到信号有2秒的间隔,有点儿类似于delay: 延迟发送,但这个throttle相当于是延迟接收

\color{OrangeRed}{欢迎大佬来指正纠错,共同学习😏!!}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容