gpt4 book ai didi

ios - SDWebImage 在单元格中重复图像而不是等待加载。

转载 作者:行者123 更新时间:2023-12-01 18:13:04 25 4
gpt4 key购买 nike

我正在使用 SDWebImage 将图像从服务器获取到我在 IOS 中的表格 View 应用程序。
但问题是,当我在表格 View 中向下滚动而不是等待图像加载时,将下载的图像放在表格 View 的前几行并重复这些图像直到最后一行,当它下载图像时它会改变那些将图像重复到该行的实际图像。

      NSURL * url = [NSURL URLWithString:string];

SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:url
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
// progression tracking code
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished,NSURL * url)
{
if (finished && image )
{

NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows];
if ([visibleIndexPaths containsObject:indexPath]) {

cell.myImage.image = image;

}

}

}];

最佳答案

实际上,这不是 SDWebImage 的错误。 ,而是 UITableView 的本质作品。 downloadImageWithURL , 是一个异步进程,因此当您的 tableView 委托(delegate)/数据源方法被调用时,图像尚未下载,因此 cellForRow没有要显示的图像。
要克服这个问题,您应该首先检查缓存中的图像

[[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:ImageUrl]]

如果是,则将图像设置为 UIImageView 否则使用 downloadImageWithURL下载图像并添加单元格标记(将图像显示到正确的行)为
cell.tag = indexPath.row;

在成功下载首先检查正确的行为
if(cell.tag == indexPath.row){

并将图像设置为 UIImageView。这里是 setImage 方法。
-(void)setImage:(SLFirstTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath{
SLFirstTableViewCellItem * slFirstTableViewCellItem = [self.categories objectAtIndex:indexPath.row]; // categories is array of items,replace with yours.

NSString *ImageUrl = slFirstTableViewCellItem.imageUrl; //assume image url is in slFirstTableViewCellItem object.

cell.tag = indexPath.row;

if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:ImageUrl]]){
[cell.imgItem setImage: [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:ImageUrl]];
[self hideProgressView:cell];
}else{
[self showProgressView:cell];

[SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:ImageUrl]
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
// progression tracking code
}
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
{

if (image && finished)
{
[[SDImageCache sharedImageCache] storeImage:image forKey:ImageUrl]; // cache image

if(cell.tag == indexPath.row){ // check if correct row
[cell.imgItem setImage:image];
[self hideProgressView:cell];
}
}else{
cell.imgItem.hidden = YES;
cell.progressBar.hidden = YES;
}
}];
}
}

并定义 showProgressViewhideProgressView方法如
-(void)showProgressView:(SLFirstTableViewCell *)cell {
cell.progressText.hidden = NO;
cell.progressBar.hidden = NO;
cell.imgItem.hidden = YES;
[cell.progressBar startAnimating];
[cell.progressText setText:@"Loading Image..."];
}

-(void)hideProgressView:(SLFirstTableViewCell *)cell{
cell.progressBar.hidden = YES;
cell.progressText.hidden = YES;
cell.imgItem.hidden = NO;
[cell.progressBar stopAnimating];
}

最后调用 setImage来自 cellForRowAtIndexPath方法(在返回单元格之前)作为
[self setImage:cell atIndexPath:indexPath];

关于ios - SDWebImage 在单元格中重复图像而不是等待加载。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com