7

我正在从互联网上的表格视图中加载一些图像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

在此处输入图像描述

在此处输入图像描述

4

5 回答 5

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;
}
于 2013-10-30T13:25:15.947 回答
1

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

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

于 2013-10-30T13:57:06.460 回答
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];
                            }
                        }];
于 2013-10-29T10:03:44.580 回答
0

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

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

于 2013-10-30T13:14:21.217 回答
0

您必须从服务器异步加载,以便您的 tableView 将平滑滚动。

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

https://stackoverflow.com/a/15331306/1713478

于 2013-10-30T13:04:21.283 回答