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];
Другие вопросы по тегам