Мне нужно получать данные с сервера каждые 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];
}];
}];
Да, ваш код намного чище, чем мой. Просто не знакомы с RACReplaySubject. – JerryZhou
'RACReplaySubject' - это своего рода« ручной »сигнал. Это похоже на изменяемый переменный эквивалент функционального реактивного мира. Вы скажете его вручную, когда нужно отправить 'next',' error' и 'completed'. Поскольку он имеет емкость '1', он сохраняет последний отправленный' next' и перенаправляет его на любые новые подписки. –
Я проверил ваш код, только одна небольшая проблема (или может быть его особенностью): задержка может задержать 300 или 301 секунд, и он не любит таймер с функциейLeeway, чтобы сделать смещение интервала; Какой таймер дает, если это 301 секунд, в следующий раз он может вернуться к 209 секундам, чтобы сделать его соболиным. – JerryZhou