Остановка NSTimer - PullRequest
       6

Остановка NSTimer

2 голосов
/ 14 ноября 2009

Хорошо, этот код довольно простой. Пользователь вводит ответ в текстовое поле, если оно равно «первый + второй», они получают точку. Затем у них есть 5 секунд, чтобы ответить на следующую математическую задачу. Если они это сделают, функция doCalculation запускается снова, и они получают другую точку. Если они этого не делают, то запускается функция «onTimer», и дерьмо попадает в вентилятор.

Проблема в том, что, когда пользователь исправляет несколько проблем подряд, «doCalculation» запускается несколько раз, а затем у меня сразу несколько таймеров. Это действительно начинает портить игру.

Мне нужно остановить таймеры. Очевидно, использовать «Invalidate», но я не знаю, где. Я не могу сделать таймер недействительным до того, как он запустится, так что ... 1005 *

Еще один вариант, который я не знаю, как это сделать: что если всякий раз, когда вы решаете проблему, она просто устанавливает таймер на 5 секунд вместо создания нового. Но как я могу узнать, был ли таймер уже создан? Я не уверен, каков наилучший ход действий или синтаксис. Мысли?

Большое спасибо!

- (IBAction)doCalculation:(id)sender
{
    NSInteger numAnswer = [answer.text intValue];
    if ( numAnswer == first + second) {
        numAnswered++;
        NSString *numberAnsweredCorrectly = [[NSString alloc] initWithFormat:@"%d", numAnswered];
        numCorrectlyAnswered.text = numberAnsweredCorrectly;
        answer.text = @"";

        NSTimer *mathTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];     

        //Set the variables to two HUGE numbers, so they can't keep plugging in the same answer

        first = arc4random() % 10;
        second = arc4random() % 10;

        NSString *firstString = [[NSString alloc] initWithFormat:@"%d", first];
        NSString *secondString = [[NSString alloc] initWithFormat:@"%d", second];

        firstNumber.text = firstString;
        secondNumber.text = secondString;
    }

Ответы [ 2 ]

6 голосов
/ 14 ноября 2009

Я бы переместил mathTimer в заголовок вашего класса:

//inside your .f file:
@interface YourClassNAme : YourSuperClassesName {
    NSTimer *mathTimer
}


@property (nonatomic, retain) NSTimer *mathTimer;

//inside your .m:
@implementation YourClassNAme 
@synthesize mathTimer;

-(void) dealloc {
   //Nil out [release] the property
   self.mathTimer = nil;
   [super dealloc];
}

И измените свой метод для доступа к таймеру через свойство:

- (IBAction)doCalculation:(id)sender
{
    NSInteger numAnswer = [answer.text intValue];
    if ( numAnswer == first + second) {
        numAnswered++;
        NSString *numberAnsweredCorrectly = [[NSString alloc] initWithFormat:@"%d", numAnswered];
        numCorrectlyAnswered.text = numberAnsweredCorrectly;
        answer.text     = @"";

        [self.mathTimer invalidate];  //invalidate the old timer if it exists
        self.mathTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];             

        //Set the variables to two HUGE numbers, so they can't keep plugging in the same answer

        first = arc4random() % 10;
        second = arc4random() % 10;

        NSString *firstString = [[NSString alloc] initWithFormat:@"%d", first];
        NSString *secondString = [[NSString alloc] initWithFormat:@"%d", second];

        firstNumber.text = firstString;
        secondNumber.text = secondString;
    }
1 голос
/ 14 ноября 2009

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

...