美文网首页
SDWebImage源码解析(3)——更新Cache

SDWebImage源码解析(3)——更新Cache

作者: 无忘无往 | 来源:发表于2017-03-30 19:33 被阅读35次

    当SDWebImage下载图片成功后,就会调用Complete block。在Complete block中,会更新SDWebImage的Cache。

    更新Cache只用调用一个SDImageCache的方法:

    /**
     * Store an image into memory and optionally disk cache at the given key.
     *
     * @param image       The image to store
     * @param recalculate BOOL indicates if imageData can be used or a new data should be constructed from the UIImage
     * @param imageData   The image data as returned by the server, this representation will be used for disk storage
     *                    instead of converting the given image object into a storable/compressed image format in order
     *                    to save quality and CPU
     * @param key         The unique image cache key, usually it's image absolute URL
     * @param toDisk      Store the image to disk cache if YES
     */
    - (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk
    

    实现为:

    - (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk {
        if (!image || !key) {
            return;
        }
        // if memory cache is enabled
        if (self.shouldCacheImagesInMemory) { // 更新memory缓存
            NSUInteger cost = SDCacheCostForImage(image);
            [self.memCache setObject:image forKey:key cost:cost];
        }
    
        if (toDisk) {
            dispatch_async(self.ioQueue, ^{  // 更新disk缓存,注意这为了保证disk读写的thread安全,利用了线性队列
                NSData *data = imageData;
    
                if (image && (recalculate || !data)) {
    #if TARGET_OS_IPHONE
                    // We need to determine if the image is a PNG or a JPEG
                    // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html)
                    // The first eight bytes of a PNG file always contain the following (decimal) values:
                    // 137 80 78 71 13 10 26 10
    
                    // If the imageData is nil (i.e. if trying to save a UIImage directly or the image was transformed on download)
                    // and the image has an alpha channel, we will consider it PNG to avoid losing the transparency
                    int alphaInfo = CGImageGetAlphaInfo(image.CGImage);
                    BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone ||
                                      alphaInfo == kCGImageAlphaNoneSkipFirst ||
                                      alphaInfo == kCGImageAlphaNoneSkipLast);
                    BOOL imageIsPng = hasAlpha;
    
                    // But if we have an image data, we will look at the preffix
                    if ([imageData length] >= [kPNGSignatureData length]) {
                        imageIsPng = ImageDataHasPNGPreffix(imageData);
                    }
    
                    if (imageIsPng) {
                        data = UIImagePNGRepresentation(image);
                    }
                    else {
                        data = UIImageJPEGRepresentation(image, (CGFloat)1.0);
                    }
    #else
                    data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations usingType: NSJPEGFileType properties:nil];
    #endif
                }
    
                [self storeImageDataToDisk:data forKey:key];
            });
        }
    }
    

    相关文章

      网友评论

          本文标题:SDWebImage源码解析(3)——更新Cache

          本文链接:https://www.haomeiwen.com/subject/ftmyottx.html