Извлечение изображений с сервера при рисовании ячейки - PullRequest
0 голосов
/ 17 августа 2011

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

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

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

Рендеринг ячейки происходит до того, как изображение действительно нарисовано.

Ответы [ 4 ]

1 голос
/ 25 августа 2011
    NSString *imgUrl = [ImageURLArray objectAtIndex:indexPath.row];

if(imgUrl != nil)
{
    NSString * ImagePath;

    NetworkManager *manager = [[NetworkManager alloc] init];

    ImagePath = [manager GetFile:imgUrl];

    [manager release];

    manager = nil;

    if(ImagePath != nil)

    {

          UIImage *newImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:ImagePath]];        

        UIGraphicsBeginImageContext(CGSizeMake(50, 50));

        // now redraw our image in a smaller rectangle.
        [newImage drawInRect:CGRectMake(25, 10, 30, 30)];

        newImage  = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        cell.imageView.image  = newImage; 
    }
}
  return cell;

}

надеюсь, что это решит вашу проблему

0 голосов
/ 17 августа 2011

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

0 голосов
/ 17 августа 2011

извлекает изображения, когда я передаю данные с сервера, и передаю информацию для просмотра. лайк

ImageView *imageView = [[ImageView alloc] initWithNibName:@"ImageView" bundle:[NSBundle mainBundle]];
imageView.prod=self.prod;
imageView.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:imageView animated:YES];
[imageView release];
imageView=nil;

надеюсь, что это решит вашу проблему

0 голосов
/ 17 августа 2011

Что может случиться, если у вас есть основной поток, который является потоком отображения пользовательского интерфейса. Извлекая изображение из URL из этого потока, вы по существу блокируете ячейку (то есть прокручиваете). Также может случиться так, что изображение находится в процессе загрузки, в этом случае вы не увидите его, пока оно не загрузится.

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

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

Не волнуйтесь, вам не нужно все это реализовывать. Нет смысла изобретать велосипед. Вот потрясающая библиотека, которую я использую для того же - UIImageView + WebCache

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