Подтвердить что ты не робот

Как изменить время для 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.

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

4b9b3361

Ответ 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]);
}