iOS-NSOperation-自定义

 #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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容