美文网首页
SDWebImage源码分析

SDWebImage源码分析

作者: superKelly | 来源:发表于2015-08-25 16:28 被阅读266次

SDWebImage源码分析

UIImageView+WebCache

<code>sd</code>

- (void)<code>sd</code>_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock 
{
    id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL)
     {
        dispatch_main_sync_safe(^{
            wself.image = image;
            [wself setNeedsLayout];
            if (completedBlock && finished) {
                completedBlock(image, error, cacheType, url);
            }
        });
    }];
    [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"];
}
SDWebImageManager

---单例

- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                     options:(SDWebImageOptions)options
                                    progress:(SDWebImageDownloaderProgressBlock)progressBlock
                                   completed:(SDWebImageCompletionWithFinishedBlock)completedBlock 
{
    __block SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new];
    __weak SDWebImageCombinedOperation *weakOperation = operation;

     @synchronized (self.runningOperations) {
        [self.runningOperations addObject:operation];
    }
    NSString *key = [self cacheKeyForURL:url];//根据url生成key

    operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) 
    {
        SDWebImageDownloaderOptions downloaderOptions = 0;//根据配置赋值
        id <SDWebImageOperation> subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) 
        {
            //一些失败的处理
            //获取图片成功的处理
            [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:data forKey:key toDisk:cacheOnDisk];
            completedBlock(transformedImage, nil, SDImageCacheTypeNone, finished, url);
            [self.runningOperations removeObject:operation];//互斥执行
        }];
        operation.cancelBlock = ^{
            [subOperation cancel];
            [self.runningOperations removeObject:operation];//互斥执行
        };
    }
    else if (image) //在cache中找到image
    {
        completedBlock(nil, nil, SDImageCacheTypeNone, YES, url);//主线程中执行
        [self.runningOperationsremoveObject:operation];//互斥执行
    }
    else    //在cache中没找到image,且下载动作被delegate阻止
    {
        completedBlock(nil, nil, SDImageCacheTypeNone, YES, url);//主线程中执行
        [self.runningOperations removeObject:operation];//互斥执行
    }
}];

return operation;
}
SDWebImageCombinedOperation
SDImageCache
- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock 
{
    UIImage *image = [self imageFromMemoryCacheForKey:key];//在内存中查找图片
    doneBlock(image, SDImageCacheTypeMemory);
    
    UIImage *diskImage = [self diskImageForKey:key];//在硬盘中查找图片
    doneBlock(image, SDImageCacheTypeMemory);
}
SDWebImageDownloader
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock 
{
__block SDWebImageDownloaderOperation *operation;
__weak SDWebImageDownloader *wself = self;

[self addProgressCallback:progressBlock andCompletedBlock:completedBlock forURL:url createCallback:^{
    timeoutInterval = 15.0;

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url 
                                                                cachePolicy:(options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:timeoutInterval];
    operation = [[SDWebImageDownloaderOperation alloc] initWithRequest:request
                                                               options:options
                                                              progress:^(NSInteger receivedSize, NSInteger expectedSize) 
                                                              {         SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey];
    callback(receivedSize, expectedSize);
                                                              }
                                                             completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) 
                                                             {
                                                                 SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey];
    callback(receivedSize, expectedSize);
                                                             }
                                                             cancelled:^{
                                                                 [sself removeCallbacksForURL:url];                                                                 }];
    [wself.downloadQueue addOperation:operation];
    wself.lastAddedOperation = operation;
}];

return operation;
}

相关文章

  • SDWebImage 源码分析

    SDWebImage 源码分析 首先我 fork 了 SDWebImage 的源码,见 conintet/SDWe...

  • SDWebImage源码分析

    SDWebImage源码分析 UIImageView+WebCache sd SDWebImageManager ...

  • SDWebImage源码分析

    技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...

  • SDWebImage源码分析

    SDWebImage介绍 UIView+WebCache类别: 所有设置图片的方法内部都会且仅调用此方法 UIVi...

  • SDWebImage源码分析

    SDWebImage是专门用于图片下载的框架,内部封装了图片异步下载和缓存的过程,涉及到的知识点有:(1)runt...

  • SDWebImage源码分析

    SDWebImage库是一个支持缓存的异步图片下载库。为了方便使用,它提供了UIImageView, UIButt...

  • SDWebImage源码分析

    一、SDWebImage到底是什么 Asynchronous image downloader with cach...

  • SDWebImage源码分析

    使用SDWebImage无非就是做图片缓存 一起来看下SDWebImage的几种使用方式:SDWebImage下载...

  • 源码分析SDWebImage

    SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图...

  • 源码分析SDWebImage

    /* *ThisfileispartoftheSDWebImagepackage. *(c)OlivierPoit...

网友评论

      本文标题:SDWebImage源码分析

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