Как обновить UILabel немедленно? - PullRequest
3 голосов
/ 31 августа 2010

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

Процесс:

[infoLine performSelectorOnMainThread:@selector(setText:) withObject:@"Calculating..." waitUntilDone:YES];
[distanceManager calc]; // Parses a XML and does some calculations
[infoLine performSelectorOnMainThread:@selector(setText:) withObject:@"Idle" waitUntilDone:YES];

Не следует ли ждать, пока не произойдет это "немедленно"?

Ответы [ 4 ]

4 голосов
/ 31 августа 2010

Если вы делаете это в основном потоке пользовательского интерфейса, не используйте waitUntilDone.Сделайте setText, setNeedsDisplay в полном представлении, установите NSTimer для запуска того, что вы хотите сделать, начиная с 1 миллисекунды позже, затем вернитесь из функции / метода.Возможно, вам придется разделить ваши вычисления на части, которые могут быть вызваны таймером по отдельности, возможно, конечный автомат с оператором switch (выберите блок, выполнить блок, увеличить индекс блока, выйти), который вызывается таймером до тех пор, пока это не будет сделано.Пользовательский интерфейс будет перемещаться между вашими кусками расчета и обновлять вещи.Поэтому убедитесь, что ваши чанки достаточно короткие (я использую от 15 до 200 миллисекунд).

0 голосов
/ 05 августа 2014

Использование performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval):

self.infoLine.text = @"Calculating...";
[self performSelector:@selector(likeABoss) withObject:nil afterDelay:0.001];
//...
-(void) likeABoss {
    // hard work here
    self.infoLine.text = @"Idle";
}
0 голосов
/ 06 мая 2011

Вот полезная функция, которую я добавил в подкласс UIViewController.Он выполняет селектор в следующем цикле выполнения.Это работает, но вы думаете, я должен сделать NSTimer *timer переменной экземпляра, так как, скорее всего, этот метод будет вызываться более одного раза.

- (void)scheduleInNextRunloopSelector:(SEL)selector {
    NSDate *fireDate = [[NSDate alloc] initWithTimeIntervalSinceNow:0.001]; // 1 ms
    NSTimer *timer = [[NSTimer alloc]
                      initWithFireDate:fireDate interval:0.0 target:self
                      selector:selector userInfo:nil repeats:NO];
    [fireDate release];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer release];
}
0 голосов
/ 31 августа 2010

Да waitUntilDone заставляет setText: произойти немедленно, но установка текста метки не означает экран обновляется немедленно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...