1

我需要每 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];
        }];
    }];
4

2 回答 2

1

我会将 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];
}];
于 2015-08-30T05:57:09.597 回答
1

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

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];
}];
于 2015-08-21T03:58:12.997 回答