ios - UITableVIew 从服务器加载的图片乱了
高洛峰
高洛峰 2017-04-17 11:00:55
[iOS讨论组]

我有一个TableView的界面,是一个列表页,只有一个Section,每一个Cell里都有一张图片是从服务器异步加载的。
我用ASIHttpRequest去加载图片,在每个Request里已经通过UserInfo带上了这个Cell的NSIndexPath.row,然后回调的时候,就按照这个NSIndexPath去更新Cell的默认占位图片。
但是,我发现刷两下以后,Cell里的图片又乱掉了。。。
貌似我NSIndexPath.row没用一样的。。。有没有人也遇到过一样的问题啊。。。

完整代码太复杂,把涉及到网络的代码贴一下

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// ...

    [self loadImageWithURL:[self.dataSource objectAtIndex:indexPath.row]
                     index:indexPath.row]; // 这是我自己定义的一个方法

// ...
}

- (void)loadImageWithURL:(NSString *)aURL index:(NSInteger)anIndex {
    ASIHTTPRequest *asiRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:aURL]];
    asiRequest.delegate = self;
    asiRequest.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSString stringWithFormat:@"%d", anIndex],
                            @"index",
                            nil];
    asiRequest.requestMethod = @"GET";
    [asiRequest startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest*)request {
    NSInteger index = [[request.userInfo objectForKey:@"index"] intValue];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:
                                [NSIndexPath indexPathForRow:index
                                                   inSection:0]];
    cell.imageView.image = [UIImage imageWithData:request.responseData];
}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
高洛峰

刷新TableView后,每个Cell所对应的图片URL是否有变化?

要知道图片的网络请求可能在刷新前发出,在刷新后才收到回应。可能这个原因造成了图片的混乱。

因此,还是建议将每个图片请求对应到每个具体的ImageView上,即将请求放到ImageView里,并保证在ImageView滑出屏幕时(Cell会收到prepareForReuse消息)取消相应的请求。
具体的实现可以参考SDWebImage (https://github.com/rs/SDWebImage) 或 EGOImageLoading (https://github.com/enormego/EGOImageL...)

天蓬老师

UITableView 对 cell 会有重用机制,以保证较少的内存使用。而带来的问题是,如果代码写得不仔细,可能会导致某行 cell 的内容出现在另一行。

把 cellForRowAtIndexPath 的完整代码贴出来吧。

PHPz

这个问题我曾经也遇到过,我的解决方案是:在每一个ImageView的对象中记录该图片的URL,当异步请求回调,要展示图片的时候,先检查URL是否一致,如果不一致,就先把请求下来的图片丢进缓存。

高洛峰

建议使用省时省力的EGOImageLoading

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号