UIProgressView не будет обновляться, даже если основной поток работает нормально
У меня есть основной поток, где я вызываю метод, который загружает данные (занимает некоторое время). Я вызываю этот метод с executeSelectorInBackground и передаю делегат. Метод загрузки данных регулярно перезванивает, чтобы обновить прогресс, он вызывает метод в том же классе контроллера, который первоначально запустил его в фоновом режиме (делегат). Этот метод выглядит так:
-(void)loadingProgress:(float)progress{
NSLog(@"Progress %f", progress);
myProgressView.progress = progress;
}
Итак, я знаю, что метод вызывается и выполняется, потому что я получаю в журнале показания увеличивающихся значений прогресса, но индикатор прогресса не перемещается. Все, что я нашел, заявило, что основной поток может свободно обновлять представление, но разве тот факт, что NSLog запускается, означает, что он бесплатный? В чем дело?
1 ответ
Вы должны обновить элементы пользовательского интерфейса в главном потоке. И поэтому вы должны немного изменить свой метод, потому что вы должны использовать объекты при использовании performSelectorOnMainThread:withObject:waitUntilDone:
Ваш метод должен выглядеть так:
-(void)loadingProgress:(NSNumber *)nProgress{
float progress = [nProgress floatValue];
NSLog(@"Progress %f", progress);
myProgressView.progress = progress;
}
И вы называете это с:
[delegate performSelectorOnMainThread:@selector(loadingProgress:) withObject:[NSNumber numberWithFloat:progress] waitUntilDone:NO];