使用SDWebImage时表视图滚动滞后

时间:2013-10-13 08:47:41

标签: ios sdwebimage

我正在cellForRowAtIndexPath内的表格视图中从互联网上加载一些图片。这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"ArticleCell";
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    Article *article = [parser items][indexPath.row];

    cell.title.text = article.title;
    cell.newsDescription.text = article.description;
    [cell.image setImageWithURL:[NSURL URLWithString:article.image]];

    return cell;
}

我的问题是即使我使用SDWebImage,当我向下滚动时,我的应用仍然会滞后。以下是Instruments的一些屏幕截图:

enter image description here

enter image description here

5 个答案:

答案 0 :(得分:5)

看起来即使图像的下载是在后台线程中执行的,图像数据的工作也是在主线程中完成的,因此它会阻止您的应用程序。您可以尝试SDWebImage提供的异步图像下载器。

[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL
                                                    options:0
                                                   progress:^(NSUInteger receivedSize, long long expectedSize)
                                                   {
                                                       // progression tracking code
                                                   }
                                                   completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
                                                   {
                                                       if (image && finished)
                                                       {
                                                           // do something with image
                                                       }
                                                   }
];

在您的方法中,它应该如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"ArticleCell";
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    Article *article = [parser items][indexPath.row];

    cell.title.text = article.title;
    cell.tag = indexPath.row;
    cell.newsDescription.text = article.description;
    [SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL
                                                        options:0
                                                       progress:nil
                                                      completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
     {
         if (cell.tag == indexPath.row && image && finished)
         {
            dispatch_async(dispatch_get_main_queue(), ^(){
               cell.image = image;
            });

         }
     }];

    return cell;
}

答案 1 :(得分:1)

在单独的线程上下载图像,如下所示:

NSURLRequest *request = [NSURLRequest requestWithURL:yourURL];
                        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                            if ( data )
                            {
                                UIImage *image = [[UIImage alloc] initWithData:data];
                                [cell.image setImage:image];
                            }
                        }];

答案 2 :(得分:1)

这可能与网络活动关系不大,而与图像尺寸有关。调整图像大小,特别是对于非整数乘法器,是昂贵的。如果您的图像比要放入的视图大得多,则需要调整大小并将其缓存在后台线程中,并从视图中引用缓存的副本。

要确认这是否是您的问题,请手动下载所有图像并引用本地副本。如果我是正确的,你的UITableView仍然会以同样的方式滞后。

答案 3 :(得分:0)

您必须从服务器异步加载,以便tableView顺利滚动。

请检查以下答案,您将能够解决您的问题。

<强> https://stackoverflow.com/a/15331306/1713478

答案 4 :(得分:0)

检查图像,检查类型和大小,更重要的是:一个或多个图像是否以其文件格式被破坏?文件大小,不规则(到大)边界?

尝试使用图像编辑器打开并重新保存可疑图像文件,以确保内部文件格式正常。