retry
:只要失败,就会重新执行创建信号中的block,直到成功
replay
:当一个信号被多次订阅,反复播放内容
throttle
:当某个信号发送比较频繁时,可以使用节流,在某一段时间不发送信号内容,过一段时间后获取信号的最新发出内容(有点儿类似于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相当于是延迟接收