Обновление UIProgressView с использованием GCD - правильное время - iPhone - PullRequest
0 голосов
/ 06 марта 2012

У меня есть представление UIProgress, которое я хочу обновить по мере запуска анализатора NSXML.Парсер NSXML работает в главном потоке и занимает около 30 секунд.

В конце секции синтаксического анализа я вызываю метод в моем делегате приложения:

[appDelegate updateLoadingScreen:0.75];

ПриложениеЗатем делегат вызывает метод modelLoadingProgressUpdate в загрузочном экране:

- (void)updateLoadingScreen : (float)progress {
NSLog(@"PROGRESS REQUEST !!!");

NSNumber * progressNS = [NSNumber numberWithFloat:progress];

[loadingScreen modelLoadingProgressUpdate : progressNS];

}

Затем метод modelLoadingProgressUpdate использует очередь отправки для обновления UIProgressBar:

- (void) modelLoadingProgressUpdate :(NSNumber *)progress {

dispatch_queue_t mainqueue = dispatch_get_main_queue();
dispatch_async(mainqueue, ^  { 

float updateProgress = [progress floatValue];
NSLog(@"Update Progress is %f", updateProgress);

progressView.progress = updateProgress;

});

}

Однако в моем UIProgressView ничего не обновляется.modelLoadingProgressUpdate, кажется, срабатывает только после того, как парсер завершил работу.

Может кто-нибудь определить, что не так?

1 Ответ

2 голосов
/ 07 марта 2012

Вот ваша проблема:

Анализатор NSXML работает в основном потоке и занимает около 30 секунд.

Итак, ваш NSXMLParser блокирует основной поток, поэтому отправляемый вами блок не выполняется до тех пор, пока не будет завершен NSXMLParser.

Поскольку NSXMLParser все равно работает в основном потоке, вы можете просто избавиться от dispatch_async и просто обновить progressView.progress непосредственно в modelLoadingProgressUpdate:.

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

...