IOS中ImageView中API多次加载图像

Posted

技术标签:

【中文标题】IOS中ImageView中API多次加载图像【英文标题】:Multiple Times load of image from API in ImageView in IOS 【发布时间】:2017-07-08 06:38:32 【问题描述】:

我制作了一个自定义 Tableview,它有一个图像视图和一些从 API 获取值的标签。

这是一个自定义表格,其中图像和标签从 API 接收与房地产相关的数据。

当我的自定义表加载时,值开始来自 API。

实际问题发生在图像视图中。我在图像视图中设置了本地图像,当来自 API 的数据没有图像时,它应该显示本地图像,否则数据应该显示客户在表单中提交的原始图像。

现在,当数据首先从 API 开始在图像视图中显示时,它会显示本地图像,而不是当图像开始来自 API 时,它开始显示,但是当我们在图像视图中向下滚动时,它会在图像视图中显示相同的图像并重复多次,我们无法识别哪个是原始图像。

如果有人给我他的电子邮件,我可以提供代码,他可以获得所有工作的场景。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *cellIdentifier=@"Cell";
    CustomTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    StringData* cust = [_Title objectAtIndex:indexPath.row];

    cell.Title.text = cust.title1;
    cell.area.text=cust.Area;
    cell.city.text=cust.City;
    cell.phone.text=cust.phoneno;
    cell.price.text=cust.Price;
    cell.location1.text=cust.location;
    cell.name1.text=cust.dealer_name;
    cell.email1.text=cust.dealer_email;
    cell.type1.text=cust.property_type;
    cell.status1.text=cust.status;
    cell.room1.text=cust.rooms;
    cell.washrooms.text=cust.bath;
    cell.floor1.text=cust.floors;
    cell.imagetext.text = cust.images;

    tii=cell.Title.text;
    NSLog(@"Tittttttle is %@",tii);


    NSURL *url = [NSURL URLWithString:cust.images];
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data,    NSURLResponse * _Nullable response, NSError * _Nullable error) 
        if (data) 
            UIImage *image = [UIImage imageWithData:data];
            if (image) 
                dispatch_async(dispatch_get_main_queue(), ^
                    cell.images1.image = image;
                );
            
        
    ];
    [task resume];

    return cell;

【问题讨论】:

您需要编辑您的问题以包含相关代码。特别是您的 cellForRow(at:) 方法。当你的表格滚动时,你几乎可以肯定没有考虑到单元格的重用;这个网站上有无数类似的问题 每次取图片效率不是很高。您应该使用某种缓存,例如 SDWebImage。此外,您没有在下载开始之前设置占位符图像,因此图像视图将包含最后放入其中的任何图像。在您的闭包中,您可能还想检查单元格的索引路径是否是您刚刚下载图像的索引路径,因为表格可能已经滚动并且单元格在您开始下载后被重复使用。 您能否解释一下我是否使用邮件向您发送我的项目。 @Paulw11 发生此问题是因为可重复使用的单元格。当您向下滚动时,第一个单元格是重用而不是最后一个单元格。 ***.com/questions/35196096/… 【参考方案1】:

您似乎没有将图像存储到本地应用程序内存中。每次出现单元格时,您都尝试加载图像。所以你每次都下载图像。

最佳解决方案:

您需要使用SDWebImage 存储图像本地内存。

目标-C:

#import <SDWebImage/UIImageView+WebCache.h>
...
[imageView sd_setImageWithURL:[NSURL URLWithString:@"IMAGE_URL"]
             placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

斯威夫特:

import SDWebImage

imageView.sd_setImage(with: URL(string: "IMAGE_URL"), placeholderImage: UIImage(named: "placeholder.png"))

如果您是第一次加载图像,那么它将下载图像并将其存储到本地内存中。所以从第二次开始,它将从本地本身加载。

【讨论】:

非常感谢。 @Nirmalsinh【参考方案2】:

嗯,这是因为您的单元格正在被重复使用,并且正在显示之前的图像。您可以覆盖 tableviewcell 子类的 prepareForReuse() 方法或考虑使用 SDWebImage 为 url 图像设置占位符

编辑:解释

您正在下载您的图像 asyc 并将其设置为您的 tableviewcell 的图像视图,这里发生的是在您下载下一个图像时,在此之前您的单元格被重新使用并显示上一个图像。

【讨论】:

以上是关于IOS中ImageView中API多次加载图像的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView 和 ImageView - 多次设备旋转后图像未居中

在 ios 中加载每个图像视图和表格视图单元格(包含 ImageView)的进度条

如何在android studio中检查ImageView是不是已完成加载和图像

Android - 将 ImageView 保存到具有全分辨率图像的文件

加载 SDWebImage 图像大小大于 imageview 的图像

在 ImageView 中缩放图像(缩放 x,y) - IOS