补充知识点:NSCache
{
// 可以选择 NSCache 代替字典作为缓存机制.
NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存.如果其它应用需要内存时,系统自动执行这些策略.
NSCache是线程安全的,我们可以在不同的线程中添加/删除和查询缓存中的对象,而不需要锁定缓存区域.
}
2.问题:如何防止一个url对应的图片重复下载?
答:cell下载图片思路 -无沙盒缓存;
}
/*------------------------ NSOperation综合案例: 4.完善项目-添加沙盒缓存 -----------------------------*/
重点: 1.处理内存警告. 2.添加沙盒缓存.
{
1.由于添加了内存缓存机制(图片缓存和操作缓存),在接收到内存警告的时候,最好释放内存缓存.
将图片缓存在沙盒中,可以优化用户体验.以后每次展示图片,对于已经下载过的图片,就不需要重新下载.
2.添加沙盒缓存.
<1>认识沙盒:
默认情况下,每个沙盒含有3个文件夹:Documents, Library和 tmp.
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录.
Library:存储程序的默认设置或其它状态信息;
// Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方.
<2>将图片写入沙盒:将文件存储在 Library/Caches路径下
1>.获取 ~/Caches路径.
{
// 得到 Caches 路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES).lastObject;
}
2>.拼接文件路径.
{
// 拼接文件路径( path + app.icon.lastPathComponent ),以url中图片的名作为名字.
NSString *file = [path stringByAppendingPathComponent:app.icon.lastPathComponent];
}
3>.将 image转换为二进制数据. //沙盒中不能直接存取图片数据.
{
// 将 UIImage 图片转换为二进制数据
NSData *data = UIImagePNGRepresentation(webImage);
}
4>.将图片的二进制数据存入沙盒.
{
// 将图片的二进制数据存入沙盒,路径为:file
[data writeToFile:file atomically:YES];
}
<3>从沙盒中获取图片:
1>.获取 ~/Caches路径.
2>.拼接完整的图片文件路径.
3>.根据完整的图片文件路径获取图片.
{
UIImage *image = [UIImage imageWithContentsOfFile:fileName];
}
}
/*----------------------------- NSOperation综合案例: 5.SDWebImage使用 ------------------------------*/
重点:1.了解 SDWebImage.
{
1.SDWebImage简介:
SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图片的功能.
<1> SDWebImageManager
在实际的运用中,我们并不直接使用SDWebImageDownloader类(网络图片下载类)及SDImageCache类(网络图片缓存类)来执行图片的下载及缓存.
为了方便用户的使用,SDWebImage提供了SDWebImageManager对象来管理图片的下载与缓存.
我们经常用到的诸如UIImageView+WebCache等控件的分类都是基于SDWebImageManager对象的.
该对象将一个下载器和一个图片缓存绑定在一起,并对外提供两个只读属性来获取它们.
<2> UIImageView+WebCache
我们在使用SDWebImage的时候,使用的最多的是UIImageView+WebCache中的针对UIImageView的扩展方法,这些扩展方法将UIImageView与WebCache集成在一起,来让UIImageView对象拥有异步下载和缓存远程图片的能力.
其中最核心的方法是 -sd_setImageWithURL:placeholderImage:options:progress:completed:,其使用SDWebImageManager单例对象下载并缓存图片,完成后将图片赋值给UIImageView对象的image属性,以使图片显示出来.
2.面试题
1> SDWebImage的默认缓存是多长时间?
*1个星期
2> SDWebImage的默认最大并发数是多少?
*6
3> SDWebImage底层是怎么实现的?
* cell下载图片思路 –有沙盒缓存
3.SDWebImage常用方法:
1>常用方法
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
2> SDWebImageOptions
* SDWebImageRetryFailed :下载失败后,会自动重新下载
* SDWebImageLowPriority :当正在进行UI交互时,自动暂停内部的一些下载操作
* SDWebImageRetryFailed | SDWebImageLowPriority :拥有上面2个功能
* 图片下载(按进度显示图片).
3>内存处理:当app接收到内存警告时
/**
* 当app接收到内存警告
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
SDWebImageManager *mgr = [SDWebImageManager sharedManager];
// 1.取消正在下载的操作
[mgr cancelAll];
// 2.清除内存缓存
[mgr.imageCache clearMemory];
}
}