Эффективный способ перерисовки UITableViewCell, как только его данные доступны - PullRequest
4 голосов
/ 23 мая 2009

В настоящее время у меня есть один UITableViewController, который содержит много ячеек с простыми данными в нем. Когда UITableViewController создает экземпляр UITableViewCell, он начинает запускать фоновый поток для каждой отдельной ячейки, чтобы получить свое состояние от сервера. UITableViewCell является подклассом и уже имеет свойство UIImageView, которое необходимо добавить в contentView, как только данные с сервера будут готовы.

Моя проблема в том, что мне нужно вызывать [tableView reloadData] каждый раз, когда я получаю новые данные из фоновых потоков. Это немного излишне, так как я могу просто добавить UIImageView к contentView, напрямую обращаясь к уязвимой ячейке. Я просто не уверен, что лучше всего найти ячейку, когда моя утилита управления данными закончит свою работу (обращаясь к серверу).

Имеет ли смысл что-то делать, например, передавать indexPath ячейки при вызове моего диспетчера данных для выполнения его фоновой задачи, а затем передавать этот indexPath назад, когда задача выполнена? Это перебор?

Какой ваш любимый способ решения этой общей задачи?

Спасибо ТАК экипажу.

Ответы [ 2 ]

5 голосов
/ 23 мая 2009

В случае, когда данные должны изменяться внутри ячеек, я не использую метод идентификатора dequeueReusableCellWithIdentifier: (NSString *). Это останавливает UITableView от кэширования ячейки. Когда ячейки табличного представления прокручиваются за пределы экрана, они освобождаются. Есть метод делегата,

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

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

Когда ваши данные возвращаются, я обычно вызываю метод

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

, чтобы получить ячейку, затем установить текст в ячейке и вызвать его метод суперкласса UIView, - (void)setNeedsLayout.
Это скажет клетке перерисовать.

Другой способ, которым я это сделал, - это использовать пользовательскую ячейку, и этот подкласс пользовательской ячейки вызывает менеджера для своих данных непосредственно при его рисовании. Когда данные возвращаются, он вызывает собственный метод делегата для обновления своих внутренних объектов UILabel, а затем вызывает setNeedsLayout.

0 голосов
/ 23 мая 2009

Если вы не возражаете против размещения заполнителя в вашей ячейке во время загрузки изображения, вы можете использовать что-то вроде TTImageView в библиотеке Three20. Представление изображения всегда находится в ячейке, и вы указываете его URL-адрес изображения. Представление изображения обрабатывает запрос URL, и когда изображение загружается, оно автоматически отображается.

Хотя я не использую Three20, я делаю что-то очень похожее в своем коде. Это совместимо с идентификаторами повторного использования ячеек таблицы - когда ячейка прокручивается за пределы экрана, ее URL-адрес просмотра изображения изменяется на новое значение, что отменяет запрос URL-адреса (если он еще выполняется) и запускает новый. В сочетании с кэшированием при прокрутке назад изображение будет загружаться мгновенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...