重置定时器信号的最佳方法是什么?

时间:2015-08-21 03:07:56

标签: ios reactive-cocoa nstimeinterval racsignal

我需要每5分钟从服务器获取一次数据。如果我确实下拉刷新,还需要从服务器获取数据,并重置计时器

下面的代码现在是解决方案,看起来很好用。只是想知道如何简化代码?可能在ReactiveCocoa中有更好的方法吗?

    RACSignal* refreshSignal = [self.refreshControl rac_signalForControlEvents:UIControlEventValueChanged];
    self.timerSignal = [[RACSignal interval:300 onScheduler:[RACScheduler scheduler] withLeeway:2] takeUntil:refreshSignal];
    [self.timerSignal subscribeNext:^(id x) {
        NSLog(@"==========================");
        NSLog(@"[Timer1]");
        [self.viewModel performFetch];
    }];

    [refreshSignal subscribeNext:^(id x) {
        NSLog(@"==========================");
        NSLog(@"[Refresh]");
        [self.viewModel performFetch];
        self.timerSignal = [[RACSignal interval:300 onScheduler:[RACScheduler scheduler] withLeeway:2] takeUntil:refreshSignal];
        [self.timerSignal subscribeNext:^(id x) {
            NSLog(@"==========================");
            NSLog(@"[Timer2]");
            [self.viewModel performFetch];
        }];
    }];

2 个答案:

答案 0 :(得分:1)

我能想到的最干净的方法是使用RACReplaySubject,发送300的interval信号,然后切换到每次触发块时发送的最新信号。

self.timerSubject = [RACReplaySubject replaySubjectWithCapacity:1];
RACSignal * refreshSignal = [self.refreshControl rac_signalForControlEvents:UIControlEventValueChanged];
RACSignal * timeSignal = [RACSignal interval:300 onScheduler:[RACScheduler scheduler] withLeeway:2];
[self.timerSubject sendNext:timeSignal];

@weakify(self)
[[self.timerSubject.switchToLatest merge:refreshSignal] subscribeNext:^(id _) {
    @strongify(self)
    [self.viewModel performFetch];
}];

[refreshSignal subscribeNext:^(id _) {
    @strongify(self)
    [self.timerSubject sendNext:timeSignal];
}];

答案 1 :(得分:0)

我会将refreshSignal映射到定时器信号。每次refreshSignal发送一个值时,它都会映射到每五分钟发送一个值的信号。

作为旁注,我认为这个逻辑属于视图模型。在那里,结果信号可以映射到flatMap:的网络请求。如果用户再次快速刷新,则将取消正在进行的网络请求。

[[[[refreshSignal startWith:nil]
map:^id(id value) {
    return [[RACSignal interval:5 * 60 onScheduler:[RACScheduler mainThreadScheduler]] startWith:nil];
}]
switchToLatest]
subscribeNext:^(id x) {
    @strongify(self)
    [self.viewModel performFetch];
}];