объяснение, почему он не работает просто: интерфейс только обновляется после текущего runloop имеет прекращается. Runloop охватывает все вызовы, которые вы делаете в одном потоке (в настоящее время - основной поток вашего приложения).
Так, например, если вы вызываете что-то вроде for (int i=1; i<1000; i++) { label.text = i }
(в грубом псевдокоде), ваша метка не будет отображать 1000 изменений текста, она отобразит только окончательное значение.
Это сделано с помощью UIKit, так что интерфейс может быть плавным и без зазубрин.
Если вы действительно хотите выполнить несколько обновлений в пользовательском интерфейсе в том же методе, вам необходимо выполнить вычисления в фоновом потоке. В других ответах упоминается использование отложенного вызова (0,1 секунды), но это бесполезно, и он генерирует огромные задержки, если вы вызываете это повторно, скажем, сто раз. Правильное решение заключается в следующем:
- (void)doSomethingVeryLong
{
[spinner startAnimating];
// or [SVProgressHud showWithMessage:@"Working"];
[self performSelectorInBackground:@selector(processStuffInBackground)];
}
- (void)processStuffInBackground
{
for (int i = 0; i < 1e9; i++)
{
/* Make huge computations,
* wait for a server,
* teach a neurasthenic French (no offence, I'm French)
*/
}
[self performSelectorOnMainThread:@selector(workDone)];
}
- (void)workDone
{
[spinner startAnimating];
// or [SVProgressHud dismiss];
}
Если вы хотите возиться с техническим материалом, гляньте на нить руководство по программированию или ссылку NSRunloop.
Вы делаете это из основной темы? – epatel