【问题标题】:Loading Image from web make application hung从网络加载图像使应用程序挂起
【发布时间】:2012-12-31 04:16:16
【问题描述】:

我正在我的 iPhone 应用程序中从网络加载图像。我将此图像用于表格单元格的图像视图。应用程序启动后几秒钟,所有图像都已完全加载。但表格的滚动不流畅。有延迟。滚动发生在手势后几秒钟。还有抽搐。我正在使用此代码

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;

【问题讨论】:

    标签: iphone ios uitableview uiimage


    【解决方案1】:

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

            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];
    
            });
        });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        此代码:[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

        【讨论】:

          【解决方案4】:

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

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

          希望对你有所帮助.....

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-25
            • 1970-01-01
            • 2021-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多