设为首页 加入收藏

TOP

【原】SDWebImage源码阅读(一)(三)
2017-10-12 12:06:51 】 浏览:10431
Tags:SDWebImage 源码 阅读
eholder; [wself setNeedsLayout]; } }

而else上面的else if那段代码,就是表示image从网络获取成功,直接赋值给image。

哈哈,不知道你们会不会有疑惑,你怎么知道此处表示向网络获取image的,也就是注释中说的the image is loading?~~我猜的,不过我猜的没错的话,这段获取的代码既然整体赋值给了id <SDWebImageOperation> operation,那可能是为了多任务(多个图片加载),为什么呢?我怀疑SDWebImageOperation是一个NSOperation子类(这样才能放到NSOperationQueue中进行多任务嘛)。你们肯定说我是SB,这一看就是一个protocol嘛!确实是我猜错了,但是我隐约觉得既然叫Operation,不跟NSOperation有点关系也说不清啊,或者它可能模仿了NSOperation的多任务运行方式。以上都是猜测,我们还是来看代码(后面会揭秘)。

以上的代码(还有几处没说,但是涉及到什么SDImageCacheType还有其他的,暂时不去想)封装成的operation作为参数放到了sd_setImageLoadOperation中。我们接着跳到sd_setImageLoadOperation函数中。很简单,只有三行,我直接贴代码了:

1 - (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key {
2     [self sd_cancelImageLoadOperationWithKey:key];
3     NSMutableDictionary *operationDictionary = [self operationDictionary];
4     [operationDictionary setObject:operation forKey:key];
5 }

虽然很多变量和函数不认识,但是我们大概也能猜到这三行做了什么。我先看[self operationDictionary],具体定义不要看,我们知道它是一个NSMutableDictionary即可,而且既然叫operationDictionary,那么存放的一定是各种operation的序列了(当然也就包括SDWebImageOperation类型的operation),而且这些operation是根据key来索引的。好的,我们回到函数中。一进函数,先取消索引为key的operation的操作,有些人说,如果我之前正在进行索引为key的操作,那不就取消了嘛?是啊,就是这样,如果该operation存在,就取消掉了,还要删除这个key对应的object(operation)。然后重新设置key对应的operation。我们可以看看函数sd_cancelImageLoadOperationWithKey。(这一段文字我解释得不好,下面评论区有详细解释)

 1 - (void)sd_cancelImageLoadOperationWithKey:(NSString *)key {
 2     // Cancel in progress downloader from queue
 3     NSMutableDictionary *operationDictionary = [self operationDictionary];
 4     id operations = [operationDictionary objectForKey:key];
 5     if (operations) {
 6         if ([operations isKindOfClass:[NSArray class]]) {
 7             for (id <SDWebImageOperation> operation in operations) {
 8                 if (operation) {
 9                     [operation cancel];
10                 }
11             }
12         } else if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){
13             [(id<SDWebImageOperation>) operations cancel];
14         }
15         [operationDictionary removeObjectForKey:key];
16     }
17 }

代码也很容易理解,先获取到operation的序列,即[self operationDictionary]。然后根据key来索引到对应的operation,如果operation存在的话。就要取消该operation。这里有一个注意的地方,也是我之前没想到的,就是索引到的operation其实一组operation的集合,那么就需要来个遍历一个个取消掉operation序列中的operation了。最后移除key对应的object。

这里我有个疑惑:为啥operation都是id<SDWebImageOperation>?而且,你们也注意到了SDWebImageOperation只有一个cancel接口。为什么要这样设计,还有待进一步研究。

我们还是回到sd_setImageWithURL这个函数中,现在我们有个大概思路了。我们来看看我们能够理解的部分:

未完待续,请君移步【原】SDWebImage源码阅读(二)

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇UINavigationController 导航控制.. 下一篇一个裁剪图片的小工具类,通过一句..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目