0

我正在我的 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;
4

4 回答 4

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

        });
    });
于 2012-12-31T04:22:04.463 回答
2

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

于 2012-12-31T04:30:19.693 回答
1

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

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

希望它会帮助你......

于 2012-12-31T04:24:16.123 回答
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. 懒表图像
于 2012-12-31T04:24:21.107 回答