2009-08-07 6 views
2

Я пытаюсь обновить индикатор выполнения UIProgressView, который у меня есть в UIView во время длительного процесса загрузки ресурсов. Скажем, я загружаю кучу растровых изображений из файла NIB (например, сотню). После загрузки 10 я выдаю .progress в UIProgressView, который является частью UIView, который уже отображается. Итак, я выдаю:UIProgressView не обновляет, пока мое приложение загружает свои ресурсы

myView.myProgressView.progress=0.2; 

Затем я загружаю еще 10 растровых изображений, а также вопрос:

myView.myProgressView.progress=0.4; 

и т.д., и т.д. При запуске приложения, индикатор не продвигается. Он просто находится в исходном положении. Из-за того, что мне кажется, что это полный придурок, я должен загружать свои ресурсы в отдельный поток, чтобы ОС могла обновлять пользовательский интерфейс, или есть ли более простой способ? Спасибо за любую помощь.

ответ

1

Да. Загрузите их в отдельный поток. Или просто использовать что-то вроде performSelector:

[self performSelector:@selector(setProgressBar) withObject:nil afterDelay:0.0]; 

(и создать setProgressBar функцию, которая считывает текущее значение из переменной-члена и обновляет интерфейс)

+0

Привет, Marcc, Я пробовал ваш performSelector подход безрезультатно. Метод setProgressBar получил имя ПОСЛЕ завершения моего другого кода. Я даже не пытался обновить UIProgressView. Я просто поставил NSLog в setProgressBar и вышел на консоль ПОСЛЕ всех других методов загрузки ресурсов. Любые другие предложения? Можете ли вы указать мне ссылку на то, что, возможно, все это делаете в другом потоке? – kspeacock

+1

Упс. Таким образом, идея правильная, вам нужно обновлять данные по одному потоку, а не блокировать основной поток (поток пользовательского интерфейса) при этом. Я думаю, вам действительно нужно использовать performSelectorOnMainThread, если вы примете этот подход (поиск на сайте разработчика для документов на этом). – marcc

0

Вы можете запустить шаг runloop после каждого обновления Пользовательский интерфейс:

SInt32 result; 
do { 
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE); 
} while(result == kCFRunLoopRunHandledSource); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^