YLImageView的JIF图片的问题

最近做项目,涉及到了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。

你可能感兴趣的:(YLImageView的JIF图片的问题)