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