Уменьшение интервала NSTimer при каждом запуске - PullRequest
0 голосов
/ 26 октября 2011

Я хочу, чтобы мой NSTimer ускорялся при каждом запуске:

-(void)runtimer {
   int delay = delay - 1;
   [NSTimer scheduledTimerWithTimeInterval:(delay) 
                                    target:self 
                                  selector:@selector(timerTriggered:) 
                                  userInfo:nil 
                                   repeats:YES];

}

Но это не работает.Как я могу заставить задержку становиться все меньше и меньше?

Ответы [ 4 ]

3 голосов
/ 29 января 2012

Я нуждался в этом сам и написал компонент CPAccelerationTimer (Github) :

[[CPAccelerationTimer accelerationTimerWithTicks:20
    totalDuration:10.0
    controlPoint1:CGPointMake(0.5, 0.0) // ease in
    controlPoint2:CGPointMake(1.0, 1.0)
    atEachTickDo:^(NSUInteger tickIndex) {
        [self timerTriggered:nil];
    } completion:^{
        [self timerTriggered:nil];
    }]
run];

Это вызывает -timerTriggered: 20 раз, с разбросом по 10 секундам, с постоянно уменьшающимися задержками (как указано в данной кривой Безье).

1 голос
/ 26 октября 2011

Каждый раз, когда этот метод запускается, вы создаете новую переменную с именем delay, затем пытаетесь установить ее себе минус 1. Это неопределенное поведение (переменная не была инициализирована ни к чему), и, вероятно, приведет кзначение мусора для delay. *

Вам необходимо сохранить задержку в переменной экземпляра.

- (void) runTimer {
    // You are declaring a new int called |delay| here.
    int delay = delay - 1;
    // This is not the same |delay| that you have declared in your header.
    // To access that variable, use:
    delay = delay - 1;

* Проникновение синуса сверхъестественным выравниванием со зломСущества также возможны.

0 голосов
/ 26 октября 2011

Вы должны объявить задержку где-нибудь, как в интерфейсе класса или как статическую переменную.

Кроме того, каждый раз создайте новый таймер, вместо того, чтобы повторять его.

int delay = INITIAL_DELAY;

-(void)runtimer{
    [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(delay--) target:self selector:@selector(runTimer:) userInfo:nil repeats:NO];
}
0 голосов
/ 26 октября 2011

Вы не можете изменить интервал срабатывания таймера, как только вы его создали. Если вам нужен другой интервал, вы должны сделать недействительным предыдущий таймер (следовательно, вы должны сохранить ссылку на него) и создать новый таймер с другим интервалом.

...