Как часто обновлять UILabel? - PullRequest
       6

Как часто обновлять UILabel?

2 голосов
/ 11 августа 2010

В настоящее время я работаю над проектом, в котором я запрашиваю и анализирую несколько html-сайтов в контроллере.Чтобы дать некоторую обратную связь пользователю, я создал второе представление, которое отображается во время обработки данных.Он отображает метку состояния и индикатор выполнения.В моем контроллере у меня есть несколько точек, где я обновляю текст меток.К сожалению, это работает только иногда.Я полагаю, это потому, что метка перерисовывается только время от времени, и я пытаюсь делать это, вероятно, чаще, чем раз в секунду.

Не получается принудительно перерисовать с помощью [label setNeedsDisplay];

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

Все настроено правильно, и метка никогда не равна нулю.Когда я регистрирую свой метод обновления, все кажется в порядке.Это просто не отображается!

Приветствия

Вот код моих тем

- (void)startUpdateStatusThread{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
[self performSelectorOnMainThread:@selector(updateFrequently) withObject:nil waitUntilDone:NO];
[pool release];
}



- (void)updateFrequently{
NSLog(@"updateFrequently: %@", currentStatus);
test++;
[self.statusLabel setText:[NSString stringWithFormat:@"%@ - %i", currentStatus, test]];
[self.statusLabel setNeedsDisplay];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self   selector:@selector(updateFrequently) userInfo:nil repeats:NO];
}

Ответы [ 3 ]

3 голосов
/ 11 августа 2010

Прав ли я, если я предполагаю, что вы называете текстовое свойство вашего ярлыка, а также setNeedsDisplay изнутри своей "Нити", которая анализирует ваши сайты?

Обратите внимание, что: изменения в UIViews (или подклассах UIView, как ваша метка) должны выполняться в главном потоке.

Я рекомендую вам написать вспомогательный метод, который обновит вашу метку и вызовет setNeedDisplay из вызова Parser-Thread

[mainViewController performSelectorOnMainThread:@selector(yourUpdateLabelHelper:) withObject:nil waitUntilDone:NO];

это должно сделать вашу работу.

2 голосов
/ 11 августа 2010

Вы упоминаете темы.Помните, что элементы управления UIKit, такие как UILabel, могут быть обновлены только из основного потока.Убедитесь, что вы пытаетесь установить текст метки только из основного потока, а затем убедитесь, что у вас все еще есть проблемы.

РЕДАКТИРОВАТЬ из-за редактирования вопроса:

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

Во-вторых, экран iPhone отображается с частотой около 60 Гц.Это означает, что обновление происходит каждые 0,016666 секунд.Вы пытаетесь обновиться намного быстрее, поэтому на самом деле будет отображаться только каждое 160-е из ваших обновлений.

В-третьих, и, возможно, самое важное, вы, кажется, не создаете никаких потоков, если только выВызовите -startUpdateStatusThread из фонового потока.В любом случае, как только вы нажмете -update, часто все возвращается в основной поток.С частотой, которую вы планируете для этого таймера, вы, вероятно, перегружаете процессор и делаете так, чтобы система не успела нарисовать метку.Таким образом, даже если вы устанавливаете новый текст, вы не даете ему возможность визуализироваться.Вам нужно уменьшить частоту этого таймера, и вам, вероятно, нужно переосмыслить все, что вы пытаетесь сделать.

1 голос
/ 11 августа 2010

Я думаю, что создание таймера должно быть в отдельной функции: Разрешите повторение, а также сохраните таймер в переменной-члене, которую вы можете закрыть на dealloc. [NSTimer scheduleTimerWithTimeInterval: 0,0001 цель: собственный селектор: @selector (updateFrequently) userInfo: nil повторяется: ДА]; }

Функция обновления должна работать как функция обратного вызова.

С уважением Assayag

...