-
1、 任务队列管理流程
SD图片获取任务何时开启?何时结束?SD如何做到的?如下图所示
-
a、缓存读取队列在任务获取的时候,就异步放到io串行队列
-
b、图片downLoad任务由SDWebImageDownloader 使用 NSOperationQueue控制,加入队列之后,由队列根据 config配置依赖关系,确定任务执行先后顺序
关于任务队列的内容,参见(知识点补充1)
-
c 任务取消
同一个ImageView加载URL之前,如果加载过URL,先取消之前的加载任务,然后开启新的图片获取任务
常见问题:SD tableView 快速滑动的时候,滑动过程中的所有cell图片都下载下来了么?
答:没有,cell进去复用,上一个imageView尚未开启的任务将会取消
2、UIView+webCache 如果实现对imageView上任务的取消?
a、通过持有SDWebImageCombinedOperation 实现,持有通过NSMapTable弱引用对象实现,一旦Operation生命周期结束,将不在持有
-
b、Manager.runningOperation字典持有 SDWebImageCombinedOperation 对象,管理器生命周期
当imageView加载图片 任务创建,将其加入字典;
任务执行完成,从字典移除,queue释放
知识点补充:
1.NSOperation
我们知道,为了更好的提高用户体验,避免卡顿现象的发生,我们一般采用多线程的方式来进行用户体验上的提升。GCD、NSThread、NSOperation都能实现多线程。关于NSOperation的详细介绍,大家可以看下这篇文章:多线程之NSOperation简介,这里只做个简单的总结。
-
NSOperation
有两个方法:main()
和start()
。如果想使用同步,那么最简单方法的就是把逻辑写在main()
中,使用异步,需要把逻辑写到start()
中,然后加入到队列之中。 -
NSOperation
什么时候执行呢?按照正常想法,是手动调用main()
和start(),当然
这样也可以。当调用start()的时候,默认的是在当前线程执行同步操作,如果是在主线程调用了,那么必然会导致程序死锁。另外一种方法就是加入到operationQueue中,operationQueue会尽快执行NSOperation
,如果operationQueue是同步的,那么它会等到NSOperation
的isFinished等于YES后,再执行下一个任务,如果是异步的,通过设置maxConcurrentOperationCount来控制同时执行的最大操作,某个操作完成后,继续其他的操作。 - 并不是调用了cancel就一定取消了,如果
NSOperation
没有执行,那么就会取消,如果执行了,只会将isCancelled设置为YES。所以,在我们的操作中,我们应该在每个操作开始前,或者在每个有意义的实际操作完成后,先检查下这个属性是不是已经设置为YES。如果是YES,则后面操作都可以不用再执行了
参考链接:SDWebImageDownloader:https://www.cnblogs.com/LeeGof/p/6914267.html
2、NSSet与NSArray的区别与联系
1、NSSet无序 NSArray有序
2、NSSet 采用hash存储
3、用法相似