读SDWebImage库系列(1)-如何保证同一时间请求相同URL时,只进行一次网络请求

     在一次面试一个ios职位时遭遇到这样一个问题,当一个tableview中许多cell中的uiimageview请求相同地址的图片时,如何保证对于同一url只进行一次网络请求,从而避免没必要的网络请求以提高运行效率。

     对于这个问题,如果对于同一url请求,当任何一次请求没完成保存本地缓存时,其他请求先去查看本地缓存,这个时候是找不到的,所以也会发送网络请求,这样确实存在效率问题。  自己设计的图片请求如何解决这个问题,对于面试时的紧张局势首先想到的是使用字典以url为key,每次网络请求之前查找key,如果没有则请求网络下载,如果有则不请求,这样有一个问题急待解决,就是没有请求如何设置image并且在合适的时机设置image呢?想到的笨方法当然是当第一个请求完成并设置了本地缓存时通知另外的uiimage去再掉一次 sd_setImageWithURL 这个时候会走缓存获取效率非常高,这个方法还得继承uiimageview,在心的uiimageview中响应通知,显然这种方式很难得到面试官的认可,并不是他想要的答案,十分沮丧。回头翻阅了SDWbimage是如何实现的呢

SDWebimageDownloder中有很好的实现


- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock

这个方法是实际请求网络的实现


其中调用

- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock andCompletedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback

来实现相同url是否发起网络请求的判断


看一下代码比较清晰,用barrier保证顺序

dispatch_barrier_sync(self.barrierQueue, ^{

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值