我想每3秒发送一次信号(所以如果再次发出另一个信号,如果以前没有结束则跳过它) 有我的代码:
RACSignal *textViewSignal = [self.textView.rac_textSignal throttle:3];
[textViewSignal subscribeNext:^(id x) {
[[BKSocketManager sharedManager] sendTypingRequestForChatroomId:_chatRoom.chatRoomId
success:^(Response *response) {
NSLog(@"Typing request success");
}
failure:^(NSError *error) {
NSLog(@"Typing request failed with error: %@", error);
}
tag:0];
}];
但它只是发送最后一个信号,如果它们之间的延迟超过3秒。
答案 0 :(得分:1)
throttle
将延迟通过参数的时间值发送值,如果有新值并且在此之前替换它,则不会发送它。
如果您希望每3秒发送一次值,则应使用
+ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler;
设置每3秒发送一个(不重要)值的信号。然后,使用
- (RACSignal *)sample:(RACSignal *)sampler;
在interval
信号发送值时从源信号发送最新值。
这看起来像
RACSignal* timer = [RACSignal interval:3 onScheduler:[RACScheduler mainThreadScheduler];
RACSignal *textViewSignal = [[self.textView.rac_textSignal sample:timer] distinctUntilChanged];
[textViewSignal subscribeNext:^(id x) {
[[BKSocketManager sharedManager] sendTypingRequestForChatroomId:_chatRoom.chatRoomId
success:^(Response *response) {
NSLog(@"Typing request success");
}
failure:^(NSError *error) {
NSLog(@"Typing request failed with error: %@", error);
}
tag:0];
}];
最后的distinctUntilChanged
调用将阻止您在没有任何更改时启动网络请求,因为它可以保证它永远不会发送两个彼此相等的连续值。