异步下载图片

异步下载

同步发送网络请求会卡UI线程,采用异步来下载图片。

异步下载存在的问题

  • 错行问题

    • 解决:使用MVC模式,使数据一对一可解决,
    • 在MVC中增加image属性后,会导致单个模式的体积增大
    • 内存占用
    • 当接收到内存警告时清空图片时需要遍历模型中将image置为nil
    • 将图片用字典缓存起来达到一对一, 清空内存中的图片时只需要remove字典就ok
    • 创建下载任务的字典,在开始下载时将正在下载的URL写入到字典中下载完成后将字典中对应的值移除,写入防止来回滑动时重复发送网络请求,下载完后移除是为了防止如果接受到内存警告后下载的图片都已清除,但是下载任务的字典的值为移除就不会再一次去下载图片
    • 缓存下载的图片到沙盒中

    • 获取图片下载路径最后一个分隔符后面的字符串作为图片名保存

stringByAppendingPathComponentstringByAppendingString 两个方法有区别

stringByAppendingString 方法是获取caches文件名,在文件夹名后面拼接字符串,在caches上一级目录下创建文件,和caches文件夹属于同一个级别

// 获取caches文件路径
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *URL = @"http://wwww.baidu.com/image/123456.png";

NSString *imageName = [URL lastPathComponent];

// 拼接路径
// 此方法生成的路径在caches文件下目录下
NSString *filePath = [cachesPath stringByAppendingPathComponent];


// 读取图片
if (内存中没有) {
    // 沙盒读取
    UIImage *sandBoxImage = [UIImage imageWithContetsOfFile:filePath];

    **加入到内存中,方便下次加载**
} 

if (sandBoxImage == nil) {
    // 下载图片
}

// 写入到沙盒
if (imageData != nil) {
    [imageData writeToFile: filePath atomically:NO];
}