Как я могу изменить время для NSTimer? - PullRequest
18 голосов
/ 11 ноября 2010

У меня есть следующий код:

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.

Есть ли какое-нибудь решение для этого ??Я много пробовал, но это не работает.

Ответы [ 5 ]

21 голосов
/ 11 ноября 2010

Конечно, вы можете сделать это.Измените 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 здесь ... прочитайте документы, чтобы убедиться, что вы не пропустили!

6 голосов
/ 16 июля 2014

Вот одно решение вопроса Хардика с использованием свойства fireDate NSTimer (написано в Swift):

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)
}
4 голосов
/ 11 ноября 2010

Вы можете попробовать настроить FireDate таймера, см. setFireDate

1 голос
/ 03 сентября 2014

Вы не можете изменить интервал срабатывания таймера.Ни за что.Там нет API для этого.

Два очевидных обходных пути: если вы всегда изменяете интервал, вы можете просто изменить следующий раз, когда сработает таймер;это имеет приоритет над интервалом таймера.Конечно, вы должны делать это каждый раз, когда срабатывает таймер.Если вы иногда меняете интервал, просто сделайте недействительным первый таймер и создайте новый таймер с новым интервалом.

0 голосов
/ 21 октября 2016

Это просто работает для меня как шарм.

- (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]);
}
...