Как я могу создать NSTimer, который повторяется дважды, а затем останавливается - PullRequest
0 голосов
/ 29 октября 2010

Я хотел бы создать NSTimer, который повторяется дважды, затем останавливается и становится недействительным.Я бы предпочел не использовать цикл, если это возможно.Есть мысли о том, как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 29 октября 2010

Создайте статический int внутри вашей функции делегата таймера, который инициализирован в 0.
Увеличивайте его каждый раз, когда вызывается делегат.
Когда счетчик достигнет значения, которое вы хотите отключить таймер.

1 голос
/ 29 октября 2010

Это то, что должна обрабатывать цель вашего таймера, а не то, что должен обрабатывать сам таймер. Вы можете либо установить повторяющийся таймер и сделать так, чтобы цель аннулировала его при повторном срабатывании, либо установить таймер однократного срабатывания, переустановить его после первого срабатывания, а затем не устанавливать заново во второй раз. 1001 *

0 голосов
/ 29 октября 2010

Я очень не согласен с Джереми, что цель должна справиться с этим.На самом деле я настолько не согласен, что создал свой собственный класс Timer, основанный на NSTimer, который вы можете настроить подробно.

- (void) doSomething: (Timer*) timer
{
    NSLog(@"This is iteration %d", timer.currentIteration);
}

- (void) startDoingSomething
{
    Timer* timer = [Timer new];
    timer.interval = 5.0; // Fire every 5 seconds
    timer.delay = 2.5;    // Start firing after 2.5 seconds
    timer.iterations = 3; // Only fire three times
    timer.target = self;
    timer.selector = @selector(doSomething:);
    [timer schedule];

    // Don't forget to release timer somewhere - the above is just an example
}

См. http://github.com/st3fan/ios-utils

0 голосов
/ 29 октября 2010

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

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

Обратите внимание, что этот тип переменной состояния можно использовать для любого числа повторений задач таймера, просто уменьшая его.

Конечные автоматы во многом похожи на то, как работают все (синхронные) цифровые микросхемы и логика.

0 голосов
/ 29 октября 2010

Одно решение может выглядеть следующим образом.

Запуск таймера

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];

Обработка таймера и повторений

int repetitions = 2;  //EDIT: remove static declaration (see below)

- (void)timerMethod:(NSTimer*)theTimer{
    NSLog(@"Timer fired");
    repetitions--;

    if(repetitions == 0){
        [theTimer invalidate];
        NSLog(@"Timer stopped");
    }
}

EDIT: Я удалил статический модификатор выше, чтобы сделать более общий пример. Первоначальная цель статики состояла в том, чтобы сохранить таймер для объектов аналогичного типа, запрос, который OP не сделал.

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