NSTimer не стреляет многократно - PullRequest
3 голосов
/ 24 января 2012

Следующее выполняется только один раз.Почему, если для параметра repeat задано значение YES?

NSTimer *timer = [NSTimer timerWithTimeInterval:1/3 target:self 
 selector:@selector(updateThingsRepeatedly:) userInfo:nil repeats:YES];

[timer fire];

Если я правильно понял, метод updateThingsRepeatedly следует вызывать каждые 1/3 секунды повторно.Разве это не правильно?

Однако он вызывает метод один раз , но не запускает цикл, как я и ожидал.

Ответы [ 6 ]

6 голосов
/ 24 января 2012

Вы можете использовать этот метод -

[NSTimer scheduledTimerWithTimeInterval:1.0/3.0 target:self selector:@selector(updateThings:) userInfo:nil repeats:YES];

и если вы используете

[NSTimer timerWithTimeInterval:1.0/3.0 target:self 
 selector:@selector(updateThings:) userInfo:nil repeats:YES];

тогда вы должны добавить его в цикл выполнения.

Обсуждение

Вы должны добавить новый таймер в цикл выполнения, используя addTimer:forMode:. Затем, по прошествии нескольких секунд, таймер срабатывает, вызывая вызов. (Если таймер настроен на повторение, нет необходимости впоследствии повторно добавлять таймер в цикл выполнения.)

чтобы добавить цикл выполнения, используйте -

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateThings:) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
6 голосов
/ 24 января 2012

1/3 оценивается как 0. Замените его на 1.0/3.0, и вы будете установлены.

Это способ C работать с числами. Вы должны намекнуть компилятору о желаемом типе выражения. 1/3 - это целочисленное деление, а его результатом является целое число. 1.0/3.0 равно double, 1.0f/3.0f равно float. Вы можете добиться того же эффекта с помощью приведения: (double)1/(double)3.

NSTimer может быть настроен на срабатывание через 0 секунд, что означает, что он будет срабатывать один раз в конце цикла выполнения.

4 голосов
/ 24 января 2012

Используйте -scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: и не звоните -fire.

И используйте числа с плавающей запятой для своего временного интервала.Т.е. 1,0 / 3,0.

1 голос
/ 24 января 2012

Вы должны добавить его в цикл выполнения:

Планирование таймеров в циклах выполнения

Объект таймера может быть зарегистрирован только в одном цикле выполнения за раз, хотя онмогут быть добавлены к нескольким режимам цикла выполнения в этом цикле выполнения.Существует три способа создания таймера:

1) Используйте scheduleTimerWithTimeInterval: invocation: repeats: или scheduleTimerWithTimeInterval: target: selector: userInfo: repeatats: метод класса, чтобы создать таймер и запланировать его в текущем цикле выполненияв режиме по умолчанию.

2) Используйте timerWithTimeInterval: invocation: repeats: или timerWithTimeInterval: target: selector: userInfo: repeatats: метод класса, чтобы создать объект таймера без планирования его в цикле выполнения.(После его создания вы должны добавить таймер в цикл выполнения вручную, вызвав addTimer: forMode: метод соответствующего объекта NSRunLoop.)

3) Выделите таймер и инициализируйте его, используя initWithFireDate: interval:target: selector: userInfo: repeat: метод.(После его создания вы должны добавить таймер в цикл выполнения вручную, вызвав addTimer: forMode: метод соответствующего объекта NSRunLoop.)

После планирования в цикле выполнения таймер срабатывает с заданным интерваломпока это не признано недействительным.Неповторяющийся таймер делает себя недействительным сразу после срабатывания.Однако для повторяющегося таймера вы должны самостоятельно аннулировать объект таймера, вызвав его метод invalidate.Вызов этого метода запрашивает удаление таймера из текущего цикла выполнения;в результате вы всегда должны вызывать метод invalidate из того же потока, в котором был установлен таймер.Аннулирование таймера немедленно отключает его, чтобы он больше не влиял на цикл выполнения.Затем цикл выполнения удаляет и освобождает таймер либо непосредственно перед возвратом метода invalidate, либо в какой-то более поздний момент.После признания недействительными объекты таймера не могут быть повторно использованы.

и, как заметил Costique (+1), вам нужно будет указать соответствующий интервал времени.

, тогда вы должны быть полностью настроены.

0 голосов
/ 24 января 2012

Вы не запланировали этот таймер с помощью runloop. Причина, по которой он срабатывает, заключается в том, что вы его уволили вручную. В общем, вам не нужно этого делать, но вам нужно запланировать это с помощью runloop. Вы можете использовать удобный метод для автоматического планирования таймера с помощью runloop:

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1./3 target:self selector: @selector(updateThings:) userInfo:nil repeats:YES];
0 голосов
/ 24 января 2012

заменить 1/3 на 1,0 / 3,0.Также используйте addTimer: forMode: для цикла выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...