iOS — выполнение фрагмента кода в течение 10 секунд

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

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

но я не могу понять, как остановить его выполнение через 10 секунд. Аргумент «повторяет», похоже, не учитывает указанное время. Может ли кто-нибудь указать мне направление, куда я должен идти с этим?

Спасибо Брайан


person Brian Boyle    schedule 13.07.2012    source источник
comment
Будет ли применим этот ответ?   -  person thegrinner    schedule 13.07.2012


Ответы (4)


Вам нужно отправить сообщение invalidate в NSTimer, который выдает вам scheduleTimerWithTimeInterval:target:selector:userInfo:repeats. Например, назначьте NSTimer, который метод возвращает вам в свойстве или iVar вашего класса, и через 10 секунд вызовите для него invalidate.

Пример:

.h:

@interface myClass{
NSTimer *myT;
}
[...]

.m:

[...]
{
    myT = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(getLevel:) userInfo:nil repeats: YES];

    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(stop) userInfo:nil repeats:NO];
}

-(void)stop{
    [myT invalidate];
}
[...]

Вы можете избежать еще одного NSTimer, если хотите, внедрив какой-то флаг finish и отследив, сколько раз вы отправили сообщение методу getLevel, так как это каждые 0,5 секунды, это будет 20 раз.

Но я бы предпочел 2 объекта NSTimer, потому что вы знаете, что это 10 секунд, независимо от другого таймера, который вы можете изменить, увеличить или уменьшить его частоту...

person Daniel    schedule 13.07.2012

Другой способ, которым вы могли бы пойти, - это определить селектор, скажем, -(void)stopTimer{}, в котором вы аннулируете таймер. Затем, когда вы создаете таймер, в первую очередь выполните одно из следующих действий:

[self performSelector:@selector(stopTimer) withObject:nil afterDelay:10.0];

person jacerate    schedule 13.07.2012

Лучше всего сделать свойство в вашем классе.

@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, strong) int ticks;

затем в вашем селекторе getLevel вызовите это:

if (ticks >= 20) [self.timer invalidate];
// 20 is 10 seconds * 500 milliseconds
ticks++;
person Matt Hudson    schedule 13.07.2012
comment
За 10 секунд всего 20 500 мс, а не 5000, и оператор if должен быть if (ticks == 20), а не ›20. - person Kaan Dedeoglu; 13.07.2012

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

Проверьте этот ответ для получения дополнительной информации.

person Selkie    schedule 13.07.2012