Как периодически обновлять метку на iOS (каждую секунду)?
Я использую NSTimer, который срабатывает каждую секунду и обновляет метку, которая отображает оставшееся время до события.
Я отлично работаю. Проблема в том, что при прокрутке TableView моя метка не обновляется, потому что MainThread заблокирован событием touch/scroll.
Я думал о создании второго потока для таймера, но я не мог обновить метку из фонового потока. Я должен был поставить его в очередь с помощью performSelector... на MainThread, где он застрял бы как раньше.
Есть ли способ обновить метку во время прокрутки?
Ответы
Ответ 1
Проблема заключается в том, что schedTimer не будет вызван, пока основной поток отслеживает касания. Вам нужно запланировать таймер в цикле основного запуска.
Итак, вместо того, чтобы делать
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
использование
NSTimer* timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
Ответ 2
попробуйте следующее:
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
Ответ 3
Вы могли также использовать GCD. Поэтому запустите
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
});
и теперь в вашем методе updateLabel
- (void) updateLabel:(id) sender {
NSString *text = @"some text";
dispatch_sync(dispatch_get_main_queue(), ^{
label.text = text;
});
}
Это обновит метку в основном потоке.