首先解释一下这三个关键字在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 没有改变时,才会进行搜索请求
网友评论