首页 > 代码库 > 源码0502-06-掌握-多图片下载

源码0502-06-掌握-多图片下载

 

 

//  ViewController.m//  06-掌握-多图片下载#import "ViewController.h"#import "XMGApp.h"@interface ViewController ()/** 所有数据 */@property (nonatomic, strong) NSArray *apps;/** 内存缓存的图片 */@property (nonatomic, strong) NSMutableDictionary *imageCache;@end@implementation ViewController- (NSMutableDictionary *)imageCache{    if (!_imageCache) {        _imageCache = [NSMutableDictionary dictionary];    }    return _imageCache;}- (NSArray *)apps{    if (!_apps) {        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]];                NSMutableArray *appArray = [NSMutableArray array];        for (NSDictionary *dict in dictArray) {            [appArray addObject:[XMGApp appWithDict:dict]];        }        _apps = appArray;    }    return _apps;}- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}#pragma mark - 数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return self.apps.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *ID = @"app";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];        XMGApp *app = self.apps[indexPath.row];    cell.textLabel.text = app.name;    cell.detailTextLabel.text = app.download;        // 先从内存缓存中取出图片    UIImage *image = self.imageCache[app.icon];    if (image) { // 内存中有图片        cell.imageView.image = image;    } else {  // 内存中没有图片        // 获得Library/Caches文件夹        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];        // 获得文件名        NSString *filename = [app.icon lastPathComponent];        // 计算出文件的全路径        NSString *file = [cachesPath stringByAppendingPathComponent:filename];        // 加载沙盒的文件数据        NSData *data =http://www.mamicode.com/ [NSData dataWithContentsOfFile:file];                if (data) { // 直接利用沙盒中图片            cell.imageView.image = [UIImage imageWithData:data];            // 存到字典中            self.imageCache[app.icon] = cell.imageView.image;        } else { // 下载图片            data =http://www.mamicode.com/ [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];            cell.imageView.image = [UIImage imageWithData:data];                        // 存到字典中            self.imageCache[app.icon] = cell.imageView.image;            // 将图片文件数据写入沙盒中            [data writeToFile:file atomically:YES];        }    }        return cell;}//    [NSDate date];//    获得文件属性//    [[NSFileManager defaultManager] attributesOfItemAtPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>];//    删除文件//    [[NSFileManager defaultManager] removeItemAtPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>];/* Documents Library    - Caches    - Preference tmp */@end

技术分享

 

//  XMGApp.h//  06-掌握-多图片下载#import <Foundation/Foundation.h>@interface XMGApp : NSObject/** 图标 */@property (nonatomic, strong) NSString *icon;/** 下载量 */@property (nonatomic, strong) NSString *download;/** 名字 */@property (nonatomic, strong) NSString *name;+ (instancetype)appWithDict:(NSDictionary *)dict;@end
//  XMGApp.m//  06-掌握-多图片下载#import "XMGApp.h"@implementation XMGApp+ (instancetype)appWithDict:(NSDictionary *)dict{    XMGApp *app = [[self alloc] init];    [app setValuesForKeysWithDictionary:dict];    return app;}@end

 

//  ViewController.m//  06-掌握-多图片下载#import "ViewController.h"#import "XMGApp.h"@interface ViewController ()/** 所有数据 */@property (nonatomic, strong) NSArray *apps;/** 内存缓存的图片 */@property (nonatomic, strong) NSMutableDictionary *images;/** 队列对象 */@property (nonatomic, strong) NSOperationQueue *queue;@end@implementation ViewController- (NSOperationQueue *)queue{    if (!_queue) {        _queue = [[NSOperationQueue alloc] init];        _queue.maxConcurrentOperationCount = 3;    }    return _queue;}- (NSMutableDictionary *)images{    if (!_images) {        _images = [NSMutableDictionary dictionary];    }    return _images;}- (NSArray *)apps{    if (!_apps) {        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]];                NSMutableArray *appArray = [NSMutableArray array];        for (NSDictionary *dict in dictArray) {            [appArray addObject:[XMGApp appWithDict:dict]];        }        _apps = appArray;    }    return _apps;}- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}#pragma mark - 数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return self.apps.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *ID = @"app";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];        XMGApp *app = self.apps[indexPath.row];    cell.textLabel.text = app.name;    cell.detailTextLabel.text = app.download;        // 先从内存缓存中取出图片    UIImage *image = self.images[app.icon];    if (image) { // 内存中有图片        cell.imageView.image = image;    } else {  // 内存中没有图片        // 获得Library/Caches文件夹        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];        // 获得文件名        NSString *filename = [app.icon lastPathComponent];        // 计算出文件的全路径        NSString *file = [cachesPath stringByAppendingPathComponent:filename];        // 加载沙盒的文件数据        NSData *data =http://www.mamicode.com/ [NSData dataWithContentsOfFile:file];                if (data) { // 直接利用沙盒中图片            UIImage *image = [UIImage imageWithData:data];            cell.imageView.image = image;            // 存到字典中            self.images[app.icon] = image;        } else { // 下载图片            [self.queue addOperationWithBlock:^{                // 下载图片                NSData *data =http://www.mamicode.com/ [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];                UIImage *image = [UIImage imageWithData:data];                                [NSThread sleepForTimeInterval:1.0];                                // 回到主线程显示图片                [[NSOperationQueue mainQueue] addOperationWithBlock:^{                    cell.imageView.image = image;                }];                                // 存到字典中                self.images[app.icon] = image;                // 将图片文件数据写入沙盒中                [data writeToFile:file atomically:YES];            }];        }    }        return cell;}//    [NSDate date];//    获得文件属性//    [[NSFileManager defaultManager] attributesOfItemAtPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>];//    删除文件//    [[NSFileManager defaultManager] removeItemAtPath:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>];/* Documents Library    - Caches    - Preference tmp */@end

 

源码0502-06-掌握-多图片下载