Как заставить NSTimer зацикливаться - PullRequest
0 голосов
/ 08 ноября 2011

Я пытаюсь узнать о NSTimer, используя Foundation и печатая на консоли.Кто-нибудь может сказать мне, что мне нужно сделать, чтобы заставить работать следующее?Он компилируется без ошибок, но не активирует мой метод startTimer - ничего не печатается.

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

#import <Foundation/Foundation.h>

@interface MyTime : NSObject {
    NSTimer *timer;
}
- (void)startTimer;
@end

@implementation MyTime

- (void)dealloc {
    [timer invalidate];
    [super dealloc];
}

- (void)startTimer {
     timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer:) userInfo:nil repeats:YES];
}

- (void)runTimer:(NSTimer *)aTimer {
    NSLog(@"timer fired");
}
@end


int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


    MyTime *timerTest = [[MyTime alloc] init];
    [timerTest startTimer];

    [timerTest release];

    [pool release];
    return 0;
}

Ответы [ 2 ]

6 голосов
/ 08 ноября 2011

Таймер никогда не получает шанса на запуск в вашей программе, потому что программа заканчивается почти сразу после создания таймера.

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

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

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]];

между отправкой startTimer и release на timerTest.Если вы хотите, чтобы таймер повторялся, вам необходимо продолжать поддерживать цикл выполнения.

Обратите внимание, что вам нужно делать это только в такой простой программе, как эта;когда вы создаете приложение с графическим интерфейсом, цикл запуска будет запущен через процесс установки приложения Какао и будет оставаться активным до тех пор, пока приложение не завершится.

0 голосов
/ 08 ноября 2011

Вы должны добавить свой таймер в цикл запуска по умолчанию после его инициализации:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

Поместите это в -(void)startTimer.

...