2013-01-20 2 views
1

У меня есть стандартный UITableView со стандартными ячейками (без изменений). Каждая ячейка должна иметь свой текст тянуть с другой веб-адрес:Как lazy загружать текст в UITableView?

cell.textLabel.text = [self getTitleFromURL:myURL]; 

Конечно, вызов URL на главном потоке не то, что вы хотите сделать. Итак, как мне это сделать? Я пытался что-то вроде (который я получил от другого StackOverflow поста) это, но он не работает:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      NSString *title = [self getTitleFromURL:myURL]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       cell.textLabel.text = title; 

      }); 
     }); 

идей? Я, наверное, пропустил что-то очень простое здесь.

+0

Почему это не работает? –

+0

На самом деле похоже, что он работает, но ячейки НЕ обновляются при начальной загрузке, только когда я прокручиваю и возвращаюсь в ячейку. –

ответ

2

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

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

if ([[tableView indexPathsForVisibleRows] containsObject:indexPath]) { 
     UITableViewCell * correctCell = [self.tableView cellForRowAtIndexPath:indexPath]; 
       correctCell.textLabel.text = title; 
       [correctCell setNeedsLayout]; 
      } 

Вы также, возможно, потребуется сообщите ячейке, чтобы обновить себя с помощью setNeedsLayout.

+0

Спасибо! [correctCell setNeedsLayout] - это то, что я сделал для меня! –

Смежные вопросы