#pragma mark-设置代理和代理方法
MFdownLoadOperation.h文件
@class MFdownLoadOperation;
@protocol MFdownLoadOperationDelegate
-(void)downLoadOperation:(MFdownLoadOperation*)operation didFishedDownLoad:(UIImage *)image;
@end
@interface MFdownLoadOperation : NSOperation
@property(nonatomic,copy)NSString *url;
@property(nonatomic,strong)NSIndexPath *indexPath;
@property(nonatomic,strong)iddelegate;
@end
MFdownLoadOperation.m文件
#import "MFdownLoadOperation.h"
@implementation MFdownLoadOperation
-(void)main {
NSURL *url=[NSURL URLWithString:self.url];
NSData *data=[NSData dataWithContentsOfURL:url];
UIImage *imgae=[UIImage imageWithData:data];
NSLog(@"--%@--",[NSThread currentThread]);
//图片下载完毕后,通知代理
if ([self.delegate respondsToSelector:@selector(downLoadOperation:didFishedDownLoad:)]) {
dispatch_async(dispatch_get_main_queue(), ^{//回到主线程,传递数据给代理对象
[self.delegate downLoadOperation:self didFishedDownLoad:imgae];
});
}
}
@end
实现使用
@interface MFViewController ()<MFdownLoadOperationDelegate>
@property(nonatomic,strong)NSArray *apps;
@property(nonatomic,strong)NSOperationQueue *queue;
@property(nonatomic,strong)NSMutableDictionary *operations;
@property(nonatomic,strong)NSMutableDictionary *images;
@end
@implementation YYViewController
#pragma mark- 懒加载apps
-(NSArray *)apps {
if (_apps==nil) {
NSString *path=[[NSBundle mainBundle]pathForResource:@"apps.plist" ofType:nil];
NSArray *tempArray=[NSArray arrayWithContentsOfFile:path];
//字典转模型
NSMutableArray *array=[NSMutableArray array];
for (NSDictionary *dict in tempArray) {
YYappModel *app=[YYappModel appModelWithDict:dict];
[array addObject:app];
}
_apps=array;
}
return _apps;
}
#pragma mark-懒加载queue
-(NSOperationQueue *)queue
{
if (_queue==Nil) {
_queue=[[NSOperationQueue alloc]init];
//设置最大并发数为3
_queue.maxConcurrentOperationCount=3;
}
return _queue;
}
#pragma mark-懒加载operations
-(NSMutableDictionary *)operations
{
if (_operations==Nil) {
_operations=[NSMutableDictionary dictionary];
}
return _operations;
}
#pragma mark-懒加载images
-(NSMutableDictionary *)images {
if (_images==Nil) {
_images=[NSMutableDictionary dictionary];
}
return _images;
}
#pragma mark-数据源方法
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.apps.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID=@"ID";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
YYappModel *app=self.apps[indexPath.row];
cell.textLabel.text=app.name;
cell.detailTextLabel.text=app.download;
//保证一个url对应一个image对象
UIImage *image=self.images[app.icon];
if (image) {//缓存中有图片
cell.imageView.image=image;
}else // 缓存中没有图片,得下载
{
//先设置一张占位图片
cell.imageView.image=[UIImage imageNamed:@"57437179_42489b0"];
MFdownLoadOperation *operation=self.operations[app.icon];
if (operation) {//正在下载
}else //当前没有下载,那就创建操作
{
operation=[[MFdownLoadOperation alloc]init];
operation.url=app.icon;
operation.indexPath=indexPath;
operation.delegate=self;
[self.queue addOperation:operation];//异步下载
self.operations[app.icon]=operation;
}
}
return cell; }
-(void)downLoadOperation:(YYdownLoadOperation *)operation didFishedDownLoad:(UIImage *)image {
//1.移除执行完毕的操作
[self.operations removeObjectForKey:operation.url];
//2.将图片放到缓存中
self.images[operation.url]=image;
[self.tableView reloadRowsAtIndexPaths:@[operation.indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
@end