Обновление табличного представления занимает много времени после "reloadData ()" - PullRequest
5 голосов
/ 20 февраля 2011

Это то, что я пытаюсь сделать: получить XML из RSS от Apple, содержащего информацию о приложениях, проанализировать его и отобразить приложения в представлении UITable.

Проблема в том, что после "reloadData ()msgstr "до отображения информации требуется около 5 секунд.Кроме того, приложение всегда аварийно завершает работу при первом запуске после открытия проекта.

вот проект: http://www.mediafire.com/?2dn6g916bh9uf4v

Ответы [ 2 ]

20 голосов
/ 20 февраля 2011

Принятая идиома для отображения медленно загружаемых (т. Е. Сетевых) данных в таблице состоит в том, чтобы показать индикатор активности в ячейке, если данные еще не представлены в таблице, а затем загрузить данные в фоновом режиме (NSOperationQueue и NSOperation отлично подходят для этого), и отправлять уведомление, когда данные будут готовы.Это почти наверняка ваша собственная задержка (сетевая задержка и время синтаксического анализа) при предоставлении данных в таблицу, а не задержка UITabvleView при обработке вашего вызова reloadData.

Редактирование: еще некоторая информация и решение этой задержки:

  • Код вызывает подпрограммы пользовательского интерфейса ("[таблица reloadData]") вне основного потока.Это плохо, не делайте этого.

  • Вы пытаетесь «вставить» информацию об изображении в таблицу в [self loadImages] вместо того, чтобы таблица «вытягивала» информацию в строкуза один раз в cellForRowAtIndexPath.

РЕДАКТИРОВАТЬ: ОК, положив деньги туда, где я говорю: я внес следующие изменения, и все задержки прошли (согласно временным меткам NSLog это около 2миллисекунды между executeSelectorOnMainThread и cellForRowAtIndexPath).

//[table reloadData];
NSLog( @"thread: calling reload" );
[table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
//[self loadImages];

Обратите внимание, что приложение все еще не в порядке, изображения еще не обновляются.Просто запомните: загрузите изображения в фоновом режиме и отправьте в класс контроллера представления уведомление о доступности новых изображений, затем вызовите [reload Table] (конечно, из обработчика уведомлений, запущенного в главном потоке!).Не вызывайте функции UIKit из какого-либо фонового потока.Этого должно быть достаточно для того, чтобы реструктурировать код, чтобы сделать правильные вещи.

1 голос
/ 13 августа 2014

Я тоже столкнулся с той же проблемой.Я решил это, запустив свой код в потоке пользовательского интерфейса как:

  NSOperationQueue.mainQueue().addOperationWithBlock(){
  //Perform action on main thread
    tableView.reloadData();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...