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源码阅读(二)。
|