UIAlertView начинает показывать, экран тускнеет, но не появляется, пока не стало слишком поздно! - PullRequest
2 голосов
/ 03 марта 2011

У меня есть кнопка, которая при нажатии делает вызовы, которые загружают информацию из ряда URL-адресов (время загрузки около 5 секунд). Прямо перед тем, как сделать эти звонки, я хочу добавить предупреждение о загрузке Когда я использую UIAlertView, экран тускнеет, как будто он собирается всплыть, но не до загрузки данных - слишком поздно! Я понятия не имею, что происходит, это похоже на то, что звонки, которые я делаю для загрузки данных, сразу становятся предпочтительнее, чем отображение нового представления, даже если они сделаны сразу после звонков, добавляющих новое представление (или показывающих предупреждение). , Это краткая версия кода:

-(void) refresh{
   UIAlertView *av = ...
   [av show]; //this should pop up before dat begins to load
   [myDataSource loadData]; //this contains a series of [NSData initWithURL] calls
   [self.tableView reloadData];
   //here I would hide the AlertView, but if I do I see it for just s split second
   //when the tableView has already reloaded
} 

Заранее благодарим за понимание!

*** EDIT Любой, кто использует executeSelectorInBackground, остерегается дополнительных сложностей создания действительно многопоточной программы. Например, утечки могут появиться, поскольку в новом потоке нет пула автоматического выпуска - вы должны добавить его и т. Д.

Ответы [ 3 ]

1 голос
/ 03 марта 2011

когда вы пытаетесь получить данные из Интернета (я полагаю, вы используете что-то вроде [NSString stringWithContentsOfURL: ...]), основной поток ожидает эти данные, и по этой причине приложение не может перерисовать интерфейс.Вы можете попытаться использовать:

[mySourceData performSelectorInBackground:@selector(loadData) withObject:nil];

Будьте осторожны, если вы используете coredata для блокировки NSManagedObjectContext перед выполнением каких-либо операций с ним и разблокировки по окончании.

1 голос
/ 03 марта 2011

Если у вас есть куча операций для выполнения, в дополнение к executeSelectorInBackground: как писал cescofry, вы можете использовать NSOperation и NSOperationQueue.

0 голосов
/ 03 марта 2011

Возможно, вам все равно не нужен UIAlertView для этого.Взгляните на MBProgressHUD на GitHub .

...