ibireme / YYWebImage

Asynchronous image loading framework.
MIT License
3.56k stars 615 forks source link

重复请求图片问题 #143

Open BeanDu opened 8 years ago

BeanDu commented 8 years ago

@ibireme 在使用YYWebImage框架的时候,发现非常耗流量,然后抓包,发现很多图片重复下载两次,甚至三次.

  1. 在YYWebImageOperation中的connectionDidFinishLoading:方法设置断点,的确如此.
  2. 在YYWebImageManager中的requestImageWithURL:方法上方添加代码: NSOperationQueue queue = _queue; if (queue) { for (YYWebImageOperation tempOperation in queue.operations) { if ([tempOperation.request.URL.absoluteString isEqualToString:url.absoluteString]) { return tempOperation; } } } 发现规避了重复下载的问题
  3. 推测在一张图片还未下载完成时重复下载,在queue中存在两个相同URL的Operation
  4. 那么问题来了:是在设计之初未考虑到这个问题,还是我使用的方法有问题?如果是我使用的方法有问题,那么关键点在何处?
HoneyLuka commented 8 years ago

在category里有判断是否已经缓存过的,你是直接用了manager吗

BeanDu commented 8 years ago

@HoneyLuka 在YYWebImageManager里面的下载队列里可能同时存在多个相同URL的Operation

HoneyLuka commented 8 years ago

你是通过什么方式(或者说通过调用哪个方法)开始加载图片的? 我觉得通常使用的话直接用UIImageView的category就好了,而且category里也确实存在判断是否已经缓存过的代码,所以应该不会出问题

HoneyLuka commented 8 years ago

sorry,理解错了你的意思,我以为你在说'缓存失效'的问题,其实关键点在于'会出现多个重复请求' 所以我建立了一个测试项目,测试了一下两个不同ImageView同时请求一张图片的情况,确实复现了你所说的'重复请求'的问题。

还有,你贴出的代码虽然解决了重复请求的问题,但是这样是不可行的,因为丢失了此次请求的所有回调(progress, transform, completion),并且返回的operation是别人的operation,在后边的执行过程中可能会出现其他未知问题(其实是因为我懒,不想继续往后看代码了...)。

最后,对于本题的重点'重复请求'的问题,还是要等作者来亲自解答了^_^

BeanDu commented 8 years ago

@HoneyLuka 嗯,是的,我贴出的代码只是为了说明存在的问题. 依然非常感谢您

xingyuemitu commented 8 years ago

加上了上面的代码后进行测试,在一个页面中请求几个相同的图片链接,只有最先请求的imageView上显示了图片,其他的没有显示,请帮忙分析一下该怎么处理这样的问题^_^

crespoxiao commented 7 years ago

我也遇到这个问题

crespoxiao commented 7 years ago

作者在养病, fork 一份慢慢理解慢慢改吧