从Web加载图像使应用程序挂起

时间:2012-12-31 04:16:16

标签: iphone ios uitableview uiimage

我正在我的iPhone应用程序中从web加载图像。我正在使用此图像作为表格单元格的图像视图。应用程序启动后几秒钟,所有图像都被完全加载。但是滚动表格不平滑。有延迟。滚动在手势后几秒钟发生。还有抽搐。我正在使用这段代码

UIImage *imagefromWeb = [UIImage imageWithData:[NSData dataWithContentsOfURL:[IconArray objectAtIndex:indexPath.row]]];
        CGSize newSize= CGSizeMake(45.0,45.0);
        UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
        [imagefromWeb drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        cell.imageView.image=newImage;

4 个答案:

答案 0 :(得分:2)

您正在同步加载图像,这就是问题尝试使用以下代码进行异步下载图像的原因:

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    dispatch_async(queue, ^{

        NSURL *imageURL=[NSURL URLWithString:urlString];
        NSData *imageData=[NSData dataWithContentsOfURL:imageURL];
        dispatch_sync(dispatch_get_main_queue(), ^{
            CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
            cell.imageView.image=[UIImage imageWithData:imageData];
            [cell setNeedsLayout];

        });
    });

答案 1 :(得分:2)

您可以使用“sdwebimage”的uiimageview类别,希望它能解决您的问题。

答案 2 :(得分:1)

您可以使用延迟加载从URL加载图片,请参阅以下示例链接

http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

希望它能帮到你......

答案 3 :(得分:1)

此代码:[NSData dataWithContentsOfURL:[IconArray objectAtIndex:indexPath.row]使应用程序挂起。因为dataWithContentsOfURL方法是同步调用。你永远不会在主线程上调用这样的同步调用,它会使你的UI无响应。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    UIImage *imagefromWeb = [UIImage imageWithData:[NSData dataWithContentsOfURL:[IconArray objectAtIndex:indexPath.row]]];
    CGSize newSize= CGSizeMake(45.0,45.0);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [imagefromWeb drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image=newImage;
   });

});

有很多开源库用于将图像加载到tableView并缓存它们,请检查:

  1. HJCache
  2. SDWebImage
  3. LazyTableImages