在绘制单元格时从服务器获取图像

时间:2011-08-17 01:28:35

标签: iphone objective-c ios cocoa-touch uitableview

为什么我们应该避免在绘制单元格时从服务器加载图像?

在我的应用程序中,我从服务器获取包含图像URL的数据。现在,我绘制单元格并使用这些图像URL从服务器获取图像并绘制它。现在,有时即使图像实际存在于该URL,图像也不会显示,因为我可以通过浏览器看到它。

是否存在可能导致此问题的细胞绘图限制?当我从服务器获取数据时,我应该获取图像。

在实际绘制图像之前是否进行了单元格渲染。

4 个答案:

答案 0 :(得分:1)

    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;

}

希望这能解决您的问题

答案 1 :(得分:0)

可能发生的是你有一个主线程,它是UI显示线程。通过从该线程从URL获取图像,您基本上阻止了该单元(即滚动)。也可能是图像处于下载过程中的情况,在这种情况下,在下载之前您将看不到它。

通常UITableView在显示准备好之前不会显示单元格,通过在主线程中进行图像下载会损害您的性能。你应该做的是启动一个后台线程,从网址和网址下载图像。然后在下载准备就绪时更新图像内容的单元格。

最好的方法是拥有一个初始占位符,如默认图像或微调器,在主图像下载完成后会被替换。

别担心,你不需要实现这一切。没有必要重新发明轮子。这是一个很棒的库,我用它来做同样的事情 - UIImageView + WebCache

答案 2 :(得分:0)

显然,图像下载需要更多时间。您应该使用占位符图像,直到下载完成。您无法阻止用户滚动。

答案 3 :(得分:0)

从服务器获取数据时获取图像并将信息传递给视图。 喜欢

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;

希望这能解决您的问题