2009-06-19 4 views
2

У меня есть подкласс UITableView и подкласс UITableViewCell, который я использую для ячеек. Я собираю все свои ячейки заранее и сохраняю их в массиве, откуда я их использую в cellForRowAtIndexPath. Помимо этого у меня есть поток, который загружает некоторые изображения в каждую ячейку в фоновом режиме. Проблема в том, что ячейки не обновляются так быстро, как загружаются изображения. Например, если я не просматриваю свой табличный вид, первые ячейки обновляются только после того, как все ячейки были изменены и поток вышел.Обновление UITableView

Любые идеи о том, как я могу эффективно обновить таблицу/ячейку?

+0

имеет это ответили? –

ответ

8

Вы пробовали позвонить [cell setNeedsDisplay], но в основной теме?

setNeedsDisplay при вызове на фоне потока не делает довольно много ничего,

попробовать это:

[cell performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO]; 
+2

+1 для «на основной теме».Святая корова, это то, что меня заводило! –

0

Вы используете обратный вызов для уведомления контроллера вашего табличного представления о том, что изображения были загружены? Если нет, это будет идеальный метод.

Когда изображение загружается, откройте обратный вызов контроллеру табличного представления, который устанавливает изображение в ячейке, а затем вызывает reloadData в таблицеView. Этот способ, когда новое изображение загружается, таблица будет обновляться, чтобы отобразить его.

+1

Jasarien прав, вы должны использовать какой-либо делегат для обратного вызова вашего ViewController, обновляющего изображение в ячейке. Затем вы можете вызвать reloadData или setNeedsDisplay в ячейке. Вы также должны подумать о том, чтобы НЕ делать свои строки заранее. Это убьет производительность и использует тонну памяти в зависимости от количества ячеек. Вы должны повторно использовать ограниченное количество ячеек. – Jab

0

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

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

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

По завершении каждой операции вы можете сделать обратный вызов ячейке или tableViewController (возможно, создать протокол делегатов, чтобы сделать это очень просто).

Если у вас есть операция для комбинации изображений/ячеек, вы должны обновить каждую ячейку по мере завершения операции. Выполнение этого вместе с приоритетом операций даст вам оптимальное решение.

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

0

Вы пробовали позвонить [cell setNeedsDisplay]?

+0

ОК, вот что я делаю: from cellForRowAtIndexPath Я отправляю набор, необходимый для отображения всех видимых ячеек. Тем не менее, нет никакой разницы, и ячейки не обновляются. Я начинаю чувствовать, что setneedsdisplay в значительной степени используется ... –

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