Я просто делал что-то подобное. У меня есть UILabel, который называется timeReamin в моем коде. Он обновляется каждую секунду, пока не достигнет 0, а затем отображается предупреждение. Я должен предупредить вас, что, поскольку таймер работает в том же потоке, что и ваш пользовательский интерфейс, вы можете испытывать некоторое дрожание. Я еще не решил эту проблему, но это работает для простых таймеров. Вот код, который я использую:
- (void)createTimer {
// start timer
gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain];
[[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
timeCount = 5; // instance variable
}
- (void)timerFired:(NSTimer *)timer {
// update label
if(timeCount == 0){
[self timerExpired];
} else {
timeCount--;
if(timeCount == 0) {
// display correct dialog with button
[timer invalidate];
[self timerExpired];
}
}
timeRemain.text = [NSString stringWithFormat:@"%d:%02d",timeCount/60, timeCount % 60];
}
- (void) timerExpired {
// display an alert or something when the timer expires.
}
Разобрался с резьбовым решением, которое устраняет джиттер. В методе viewDidLoad или applicationDidFinishLaunching вам нужна строка, такая как:
[NSThread detachNewThreadSelector:@selector(createTimer) toTarget:self withObject:nil];
Это запустит поток, используя метод createTimer. Однако вам также необходимо обновить метод createTimer:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
// start timer
gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain];
[[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
[runLoop run];
[pool release];
Большинство из них - стандартные подпрограммы ввода потоков. Пул используется для стратегий управляемой памяти, используемых потоком, который. Это не нужно, если вы используете сборщик мусора, но это не повредит. Runloop - это цикл событий, который выполняется непрерывно, чтобы генерировать события, когда время истекает каждую секунду. В вашем основном потоке есть runloop, который создается автоматически, это runloop, специфичный для этого нового потока. Затем обратите внимание, что в конце есть новое утверждение:
[runLoop run];
Это гарантирует, что поток будет выполняться бесконечно. Вы можете управлять таймером, таким как перезапуск или установка других значений в других методах. Я инициализирую свой таймер в других местах моего кода, и именно поэтому эта строка была удалена.