Отображение UIActivityIndicator при выполнении синхронной загрузки - PullRequest
0 голосов
/ 08 июля 2010

Я загружаю XML для заполнения массива, используемого для создания UITableView.Пока меня не проинформируют, я полагаю, что мне нужно полностью загрузить массив, прежде чем я смогу отобразить его в таблице (также он только текстовый и очень маленький, поэтому он загружается в разумные сроки при самом медленном из возможных соединений).Это занимает около 3-5 секунд при самой низкой скорости, поэтому было бы неплохо отобразить индикатор активности в строке состояния во время загрузки.

Я звоню ...

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

... до того, как я сделаю НИЧЕГО (затем выключу его, как только я сделаю ВСЕ), но он просто выскакивает и выключается примерно за минимальное количество миллисекунд, которые делают его видимым человеческому глазу.* Любые предложения относительно того, почему у меня есть этот опыт?

Спасибо, Z @ K!

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Легким ответом для меня был GCD, Grand Central Dispatch. Мне почти не пришлось изменять мой код ...

Мой код начался как этот ...

self.table_array = [self.webQuery downloadAndParseXMLForTable];
[(UITableView *)self.view reloadData];

* webQuery - это пользовательский объект, который загружает и анализирует данные XML из Интернета. ** downloadAndParseXMLForTable - это пользовательский метод, который синхронно загружает и анализирует файл XML, а затем возвращает объект (NSArray *) для поддержки табличного представления.

Измененный код ниже показывает ТОЛЬКО изменения, которые я должен был сделать, чтобы принять GCD, и сохранить отзывчивость моего пользовательского интерфейса.

dispatch_queue_t table_download_queue = dispatch_queue_create("com.yourcompany.queuename", NULL);

dispatch_async(table_download_queue, ^{
    self.table_array = [self.webQuery downloadAndParseXMLForTable];
    dispatch_async(dispatch_get_main_queue(), ^{
        [(UITableView *)self.view reloadData];
    });
});

dispatch_release(table_download_queue);

Вот и все! Я надеюсь, что это помогает другим в моем затруднительном положении ...

Cheers, Z @ K!

ВНИМАНИЕ: на WWDC 2010 было упомянуто, что GCD в настоящее время не может поддерживать безопасные передачи. Я не помню деталей, но оратор, Куинн, был очень непреклонен в этом. Я полагаю, что процесс, который он предложил, требовал NSOperation ...

1 голос
/ 08 июля 2010

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

Вам нужно будет поместить синхронную загрузку в отдельный поток или использовать NSURLConnection: initWithRequest (который является многопоточным), чтобы приложение могло отвечать ожидаемым образом.

...