最近做项目,涉及到了YLImageView处理gif图片的问题。发现,当同时下载图片链接相同的时候,后下载的gif图片只会展示最后一帧。
刚拿到这个bug的时候是非苦恼,查验了自己的代码并没有问题。接着又查找YLImageView的底层。发现底层的一个方法确实存在问题。
//_prefetchedNum=10
if(self.images.count > _prefetchedNum) {
if(idx != 0) {
[self.images replaceObjectAtIndex:idx withObject:[NSNull null]];
}
NSUInteger nextReadIdx = (idx + _prefetchedNum);
for(NSUInteger i=idx+1; i<=nextReadIdx; i++) {
NSUInteger _idx = i%self.images.count;
if([self.images[_idx] isKindOfClass:[NSNull class]]) {
dispatch_async(readFrameQueue, ^{
CGImageRef image = CGImageSourceCreateImageAtIndex(_imageSourceRef, _idx, NULL);
@synchronized(self.images) {
if (image != NULL) {
[self.images replaceObjectAtIndex:_idx withObject:[UIImage imageWithCGImage:image scale:_scale orientation:UIImageOrientationUp]];
CFRelease(image);
} else {
[self.images replaceObjectAtIndex:_idx withObject:[NSNull null]];
}
}
});
}
}
}
从YLImageView的源码处可以看出,每次会处理gif中的十张图片,然后依次往后处理十张。如果出现了两个URL相同的gif,最后处理的gif图片,会拿到上一个gif的处理结果,也就是拿到gif数组的最后一帧。
所以,gif应该不支持同时处理两个相同url的情况,这在代码容错方面容易被测试提bug。