我正在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
的一些屏幕截图:
答案 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顺利滚动。
请检查以下答案,您将能够解决您的问题。
答案 4 :(得分:0)
检查图像,检查类型和大小,更重要的是:一个或多个图像是否以其文件格式被破坏?文件大小,不规则(到大)边界?
尝试使用图像编辑器打开并重新保存可疑图像文件,以确保内部文件格式正常。