Подтвердить что ты не робот

Как периодически обновлять метку на iOS (каждую секунду)?

Я использую NSTimer, который срабатывает каждую секунду и обновляет метку, которая отображает оставшееся время до события.

Я отлично работаю. Проблема в том, что при прокрутке TableView моя метка не обновляется, потому что MainThread заблокирован событием touch/scroll.

Я думал о создании второго потока для таймера, но я не мог обновить метку из фонового потока. Я должен был поставить его в очередь с помощью performSelector... на MainThread, где он застрял бы как раньше.

Есть ли способ обновить метку во время прокрутки?

4b9b3361

Ответ 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;
    });
}

Это обновит метку в основном потоке.