如何使用ReactiveCocoa每3秒发送一次信号

时间:2015-08-31 08:49:54

标签: ios objective-c reactive-cocoa

我想每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秒。

1 个答案:

答案 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调用将阻止您在没有任何更改时启动网络请求,因为它可以保证它永远不会发送两个彼此相等的连续值。