UIProgressView не будет обновляться, даже если основной поток работает нормально - PullRequest
4 голосов
/ 08 марта 2011

У меня есть основной поток, где я вызываю метод, который загружает данные (занимает некоторое время).Я вызываю этот метод с executeSelectorInBackground и передаю делегат.Метод загрузки данных регулярно перезванивает, чтобы обновить прогресс, он вызывает метод в том же классе контроллера, который первоначально запустил его в фоновом режиме (делегат).Этот метод выглядит следующим образом:

-(void)loadingProgress:(float)progress{
    NSLog(@"Progress %f", progress);
    myProgressView.progress = progress;
}

Итак, я знаю, что метод вызывается и выполняется, потому что я получаю в журнале показания увеличивающихся значений прогресса, но индикатор прогресса не перемещается.Все, что я нашел, заявило, что основной поток может свободно обновлять представление, но разве тот факт, что NSLog запускается, означает, что он бесплатный?Что происходит?

1 Ответ

11 голосов
/ 08 марта 2011

Вы должны обновить элементы пользовательского интерфейса в главном потоке. И поэтому вы должны немного изменить свой метод, потому что вы должны использовать объекты при использовании 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];
...