IOS 网络浅析-(十三 SDWebImage 实用技巧)
2016-05-02 10:31
405 查看
IOS 网络浅析-(十三 SDWebImage 实用技巧)
首先让我描述一下为了什么而产生的实用技巧。(在TableView、CollectionView中)当用户所处环境WiFi网速不够快(不能立即将图片下载完毕),在WiFi环境下又是下载高清大图。所以需要一定的时间来完成下载。而就在此时,用户不愿等,想看看上次打开App时显示的图片,此时用户会滑到处于下面的cell来查看。注意:此时,上面的cell下载图片操作并没有暂停,还在处于下载图片状态中。当用户在查看上次打开App的显示图片时(上次打开App下载完成的图片,SDWebImage会帮我们缓存,不用下载),而正好需要显示上次打开App时的图片的cell是利用tableView重用机制而从缓存池中拿出来的cell,等到处于上面的cell的高清大图已经下载好了的时候,SDWebImage默认做法是,立马把下载好的图片设置给ImageView,所以我们这时候会在底下的显示的cell显示上面的图片,造成数据错乱,这是非常严重的BUG。
解决问题
对于问题的解决我只想用最简单的方法告诉你,SDWebImage已经帮我们解决了为什么这么说呢???下面是SDWebImage中的一部源码。
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { // 关闭当前图片的下载操作 [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (!(options & SDWebImageDelayPlaceholder)) { dispatch_main_async_safe(^{ self.image = placeholder; }); } if (url) { // check if activityView is enabled or not if ([self showActivityIndicatorView]) { [self addActivityIndicator]; } __weak __typeof(self)wself = self; id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { [wself removeActivityIndicator]; if (!wself) return; dispatch_main_sync_safe(^{ if (!wself) return; if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { completedBlock(image, error, cacheType, url); return; } else if (image) { wself.image = image; [wself setNeedsLayout]; } else { if ((options & SDWebImageDelayPlaceholder)) { wself.image = placeholder; [wself setNeedsLayout]; } } if (completedBlock && finished) { completedBlock(image, error, cacheType, url); } }); }]; [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; } else { dispatch_main_async_safe(^{ [self removeActivityIndicator]; if (completedBlock) { NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; completedBlock(nil, error, SDImageCacheTypeNone, url); } }); } }
通过源码我们可以发现SDWebImage在下载图片时,第一件事就是关闭imageView当前的下载操作! 因此我们在对imafgeView的image进行赋值时使用SDWebImage得当方法即可(本地缓存)。
相关文章推荐
- ubuntu14.04 的网络配置
- 目前网络上开源的网络爬虫以及一些简介和比较
- http协议学习笔记(三)
- 深度学习进入芯片领域,揭秘寒武纪神经网络处理器
- 神经网络训练中的Tricks之高效BP(反向传播算法)
- iOS 网络编程 http
- nyoj 199 无线网络覆盖
- 网络编程学习——客户/服务器程序设计范式(二)
- 有道云网络问题
- TestHttp
- NAS 厂商的简单总结
- 【Netty4 简单项目实践】五、Netty4接收HTTP文件上传
- http与HTTPS
- 常见HTTP错误代码大全
- Android基础知识:网络编程
- linux采用NAT的连接方式连接网络时,宿主机能ping通虚拟机,虚拟机ping不通宿主机
- Android Volley网络通信框架的使用(二):Volley加载网络图片
- 《网络攻防技术与实践》第九周学习总结
- SM2算法第五篇:socket的基本原理与实现
- Android Volley网络通信框架的使用(一):Volley的简单用法