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

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

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

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

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

Ура

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

- (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];
}

person jagse    schedule 11.08.2010    source источник
comment
Зайдите в свой профиль stackoverflow.com/users/345144/jagse и примите ответы на предыдущие вопросы. Это дает кредит, где кредит должен для людей, помогающих вам.   -  person iwasrobbed    schedule 11.08.2010
comment
Знаете ли вы, насколько сильно вы загружаете процессор телефона? Если вы максимизируете его, он может никогда не успеть перерисовать. Кроме того, вы можете иметь это в виду: blogs.msdn.com/b/oldnewthing/archive/2010/05/25/   -  person Douglas    schedule 11.08.2010


Ответы (3)


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

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

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

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

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

person Jason Foreman    schedule 11.08.2010

Прав ли я, если предполагаю, что вы вызываете текстовое свойство вашей метки, а также setNeedsDisplay из своего «потока», который анализирует ваши веб-сайты?

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

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

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

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

person samsam    schedule 11.08.2010

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

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

С уважением Ассайаг

person Mayosse    schedule 11.08.2010