Как изменить время для NSTimer?
У меня есть следующий код:
timer = [[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(onTimer) userInfo:nil repeats:YES] retain];
-(void) onTimer
{
}
Через каждые 0,50 секунды вызывается метод OnTimer
.
Но теперь я хочу увеличить интервал времени.
Это означает:
OnTimer calls after 0.55
OnTimer calls after 0.60
OnTimer calls after 0.65
OnTimer calls after 0.70
OnTimer calls after 0.75
& so on.
Есть ли какое-нибудь решение для этого? Я пробовал много, но не работал.
Ответы
Ответ 1
Конечно, вы можете это сделать. Измените repeats:YES
на repeats:NO
, чтобы таймер не повторялся, а затем в onTimer
, просто запустите новый таймер с большим интервалом. Вам нужна переменная, чтобы удерживать ваш интервал, чтобы вы могли сделать его немного дольше каждый раз через onTimer
. Кроме того, вам, вероятно, больше не нужно сохранять таймер, так как он будет срабатывать только один раз, и когда это произойдет, вы получите новый таймер.
Я не эксперт Objective-C (или эксперт iOS...), и это было какое-то время, но я думаю что-то вроде этого:
float gap = 0.50;
[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO];
-(void) onTimer {
gap = gap + .05;
[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO];
}
Что-то вроде этого? О, и я действительно не слишком уверен в семантике retain
здесь... прочитайте документы, чтобы убедиться, что вы не просачиваетесь!
Ответ 2
Вот одно решение вопроса Хардика с использованием свойства fireState NSTimer (написано в Swift):
Swift 2
var timeInterval = 0.50
NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("onTimer:"), userInfo: nil, repeats: true)
func onTimer(timer: NSTimer) {
timeInterval += 0.05
timer.fireDate = timer.fireDate.dateByAddingTimeInterval(timeInterval)
}
Swift 3, 4, 5
var timeInterval = 0.50
Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(self.onTimer), userInfo: nil, repeats: true)
@objc func onTimer(timer: Timer) {
timeInterval += 0.05
timer.fireDate = timer.fireDate.addingTimeInterval(timeInterval)
}
Ответ 3
Вы можете попробовать настроить таймер FireDate, см. setFireDate
Ответ 4
Вы не можете изменить интервал срабатывания таймера. Ни за что. Там нет API для этого.
Два очевидных обходных решения: если вы всегда меняете интервал, тогда вы можете просто изменить следующий раз, когда срабатывает таймер; это имеет приоритет над интервалом таймера. Конечно, вы должны делать это каждый раз, когда срабатывает таймер. Если вы иногда меняете интервал, просто аннулируйте первый таймер и создайте новый таймер с новым интервалом.
Ответ 5
Это просто работает как прелесть для меня.
- (void)FlexibleTimer {
if (!keyTimer) {
keyTimer = [NSTimer scheduledTimerWithTimeInterval:self.intervalOfIdleTimer
target:self
selector:@selector(keyTimerExceeded)
userInfo:nil
repeats:YES];
}
else {
if (fabs([keyTimer.fireDate timeIntervalSinceNow]) < self.intervalOfIdleTimer - 1.0) {
[keyTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.intervalOfIdleTimer]];
}
}
}
- (void)keyTimerExceeded {
[self setNextDelayForFlexibleTimer];
[self FlexibleTimer];
NSLog(@"Timer Exceeded %f", [[NSDate date] timeIntervalSince1970]);
}