UITableView reloadData занимает слишком много времени

Я использую TBXML + HTTP для получения XML-данных с веб-сайта. То, что я хочу сделать, – это заполнить UITableView обработанными данными. Я создал NSMutableArray, который содержит все записи, и, насколько это возможно, все работает нормально. Проблема заключается в том, что после успешной загрузки данных с сервера и их хранения в массиве я пытаюсь обновить таблицу, чтобы показать данные, используя reloadData .

Для заполнения таблицы требуется 20 секунд. Странная часть состоит в том, что выборка происходит очень быстро, поэтому данные доступны сразу. Я не понимаю, что так долго. Вот некоторая информация из журнала:

 2012-03-17 18:46:01.045 MakeMyApp[4571:207] numberOfSectionsInTableView: 1 2012-03-17 18:46:01.047 MakeMyApp[4571:207] numberOfRowsInSection: 0 2012-03-17 18:46:01.244 MakeMyApp[4571:1f03] numberOfSectionsInTableView: 1 2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] numberOfRowsInSection: 20 2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] Ok, I'm done. 20 objects in the array. 2012-03-17 18:46:01.246 MakeMyApp[4571:1f03] Finished XML processing. 2012-03-17 18:46:06.197 MakeMyApp[4571:1f03] cellForRowAtIndexPath: 

Как вы можете видеть, он запускает пару numberOfSectionsInTableView: / numberOfRowsInSection: два раза: первое – при загрузке представления, второе – когда я делаю [self.tableView reloadData];

Вы видите, что менее чем за секунду массив заполняется 20 объектами и вся обработка работы XML выполняется. Как cellForRowAtIndexPath: срабатывает только через 5 секунд?

Вот некоторые части кода, которые могут помочь найти проблему:

 - (void)createRequestFromXMLElement:(TBXMLElement *)element { // Let's extract all the information of the request int requestId = [[TBXML valueOfAttributeNamed:@"i" forElement:element] intValue]; TBXMLElement *descriptionElement = [TBXML childElementNamed:@"d" parentElement:element]; NSString *description = [TBXML textForElement:descriptionElement]; TBXMLElement *statusElement = [TBXML childElementNamed:@"s" parentElement:element]; int status = [[TBXML textForElement:statusElement] intValue]; TBXMLElement *votesCountElement = [TBXML childElementNamed:@"v" parentElement:element]; int votesCount = [[TBXML textForElement:votesCountElement] intValue]; // Creating the Request custom object Request *request = [[Request alloc] init]; request.requestId = requestId; request.description = description; request.status = status; request.votes_count = votesCount; [requestsArray addObject:request]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { appListCell *cell = (appListCell *)[tableView dequeueReusableCellWithIdentifier:@"appListCell"]; Request *request = [requestsArray objectAtIndex:indexPath.row]; cell.appIdLabel.text = [NSString stringWithFormat:@"#%d", request.requestId]; cell.appTextLabel.text = request.description; cell.appVotesLabel.text = [NSString stringWithFormat:@"%d votes", request.votes_count]; return cell; } 

Большое спасибо!

РЕДАКТИРОВАТЬ:

 - (void)traverseXMLAppRequests:(TBXMLElement *)element { int requestCount = 0; TBXMLElement *requestElement = element->firstChild; // Do we have elements inside <re>? if ((requestElement = (element->firstChild))) { while (requestElement) { [self createRequestFromXMLElement:requestElement]; requestCount++; requestElement = [TBXML nextSiblingNamed:@"r" searchFromElement:requestElement]; } } [self.tableView reloadData]; NSLog(@"Ok, I'm done. %d objects in the array.", [requestsArray count]); } 

РЕДАКТИРОВАТЬ 2: Я попытался получить информацию только из 1 строки, вместо 20, и задержка точно такая же.

Я знаю, что это действительно старый вопрос, но я только что столкнулся с одной и той же проблемой и думаю, что могу знать причину. Может помочь кому-то, кто споткнется по этому же вопросу …

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

Попробуйте изменить reloadData на:

 dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); 

Вы вызываете reloadData в потоке, отличном от mainThread

Обязательно перезагрузите данные tableView в основном потоке, как tableView ниже:

OBJ-C:

 [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

Swift 3:

 DispatchQueue.main.async { self.tableView.reloadData() } 

Где же:

 - (void)createRequestFromXMLElement:(TBXMLElement *)element 

получить вызов? Похоже, вы можете сделать 20 веб-запросов, чтобы получить содержимое этого файла. Это определенно сделает вещи медленными (в отличие от одного запроса, чтобы получить весь XML-файл и разобрать его локально).

Можете ли вы опубликовать весь код VC?

  • Многомерный массив в таблицу
  • UITableview только прокрутка до середины - Swift 4
  • Скрыть некоторые UITableViewCells при редактировании?
  • Добавление представления Tableview to Storyboard
  • Как удалить пробел между началом ячейки и текстом?
  • Невозможно преобразовать значение типа «UITableViewCell» в указанный тип
  • Каков логический порядок методов загрузки UITableViewController?
  • Как получить все значения массива при поиске определенных значений в ячейке tableview с использованием Obejctive C?
  • Как остановить прокрутку в центре ячейки, которая больше высоты экрана
  • IOS - лучший способ стилизации ячейки UITableView с интерфейсом Builder
  • Высота ячейки UITableview в соответствии с проблемой изображения
  • Interesting Posts

    Есть ли способ «самоуничтожить» приложение изнутри самого себя?

    Локализация с переменной и константой определения в файле заголовка

    как установить новые контейнеры без влияния на другие стручки?

    Как скрыть строку состояния в iOS 7.1. с iPhone приложение работает в iPad?

    Ячейки, перекрывающиеся в виде таблицы

    Проблемы с менеджером пакетов

    Создание массива UIColor в быстром

    Как я могу создать UIView, который обрабатывает все экраны и дает эффект «затемнения»?

    Быстро, как вы определяете тип протокола с внутренним типом

    Dispatch_Async не будет работать после вызова Firebase

    ios XMPP Framework: как предоставить роль модератора пользователям

    iOS – Как использовать NSExpression с одним неизвестным параметром

    Получить координату от почтового индекса (почтовый индекс) или города / штата

    Прокрутка текста в UITextview, когда тексты меньше, а высота UITextview велика

    Как определить массив CGPoints в определении структуры?

    Давайте будем гением компьютера.