1.继承NSOperation
DownLoadImageTask.h
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @protocol DownLoadImageDelegate;//声明 @interface DownLoadImageTask : NSOperation<NSURLConnectionDelegate>{ long long totalLength; BOOL done; } @property(nonatomic,weak) id<DownLoadImageDelegate>downloadImageDelegate; @property(nonatomic,retain) NSMutableData *buffer; @property(nonatomic,retain) NSURLRequest *request; @property(nonatomic,retain) NSURLConnection *connection; - (id)initWithURLString:(NSString *)url; @end @protocol DownLoadImageDelegate //图片下载完成的委托 -(void)imageDownLoadFinished:(UIImage *)img; //更新图片下载进度条的值 -(void)updateDownProgress:(double) value; @end
#import "DownLoadImageTask.h" @implementation DownLoadImageTask - (id)initWithURLString:(NSString *)url{ NSLog(@"url=%@",url); self = [super init]; if(self){ self.request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; self.buffer = [NSMutableData data]; } return self; } //主要处理方法 -(void)start{ //或者main NSLog(@"DownLoadImageTask-start"); if(![self isCancelled]){ //暂停一下 [NSThread sleepForTimeInterval:1]; //设置connection及其代理 self.connection = [[NSURLConnection alloc]initWithRequest:self.request delegate:self]; if(self.connection!=nil){ while(!done){ [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } } } } -(void)httpConnectEndWithError{ //[self hiddenWaiting]; NSLog(@"httpConnectEndWithError"); } -(void)dealloc{ self.buffer = nil; self.connection = nil; self.request = nil; self.downloadImageDelegate = nil; } #pragma NSURLConnection delegate methods //不执行缓存 -(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse{ return nil; } //连接发生错误 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ [self performSelectorOnMainThread:@selector(httpConnectEndWithError) withObject:self waitUntilDone:NO]; [self.buffer setLength:0]; } //收到响应 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if(httpResponse && [httpResponse respondsToSelector:@selector(allHeaderFields)]){ NSDictionary *httpResponseHeaderFields = [httpResponse allHeaderFields]; totalLength = [[httpResponseHeaderFields objectForKey:@"Content-Length"] longLongValue]; NSLog(@"totalLength is %lld",totalLength); } } //接收数据 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //NSLog(@"didReceiveData..."); [self.buffer appendData:data]; double progressValue = totalLength==0?0:((double)([self.buffer length])/(double)totalLength); //更新进度条值 //[(NSObject *)self.downloadImageDelegate performSelectorOnMainThread:@selector(updateDownProgress:) withObject:[NSNumber numberWithDouble:progressValue] waitUntilDone:NO];//主线程中执行代理方法 [self.downloadImageDelegate updateDownProgress:progressValue]; } //下载完毕 -(void)connectionDidFinishLoading:(NSURLConnection *)connection{ done = YES; UIImage *img = [[UIImage alloc] initWithData:self.buffer]; //[(NSObject *)self.downloadImageDelegate performSelectorOnMainThread:@selector(imageDownLoadFinished:) withObject:img waitUntilDone:NO]; [self.downloadImageDelegate imageDownLoadFinished:img]; } -(BOOL)isConcurrent { //返回yes表示支持异步调用,否则为支持同步调用 return YES; } - (BOOL)isExecuting{ return self.connection == nil; } - (BOOL)isFinished{ return self.connection == nil; } @end
2.在ViewController中调用NSOperation子类
ViewController.h
#import <UIKit/UIKit.h> #import "DownLoadImageTask.h" @interface ViewController:UIViewController<DownLoadImageDelegate> @property(strong,nonatomic)NSOperationQueue *queue; @property(strong,nonatomic)UIImageView *appImgView; @property (strong,nonatomic)UIImage *image1; @property (strong,nonatomic)UIImage *image2; @end
ViewController.m
#import "ViewController.h" #import "DownLoadImageTask.h" typedef void (^downLoad1)(); @interface ViewController() @property (nonatomic,strong)downLoad1 downloadBlock; @end @implementation ViewController #pragma mark - LoadView -(void)loadView{ //初始化视图 [self initViews]; //显示等待框 [self showWaiting]; NSString *url = @"http://hiphotos.baidu.com/newwen666666/pic/item/01ec7750863e49600cf3e3cc.jpg"; DownLoadImageTask *task = [[DownLoadImageTask alloc]initWithURLString:url]; task.downloadImageDelegate = self; //task.operationId = index++; self.queue = [[NSOperationQueue alloc]init]; [self.queue addOperation:task]; } //初始化视图组件 -(void)initViews{ CGRect frame = [UIScreen mainScreen].applicationFrame; UIView *appView = [[UIView alloc]initWithFrame:frame]; self.view = appView; [self.view setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:1.0]]; frame = CGRectMake(0, 0, frame.size.width, frame.size.height); _appImgView = [[UIImageView alloc]initWithFrame:frame]; [self.view addSubview:_appImgView]; } //展示等待框 -(void)showWaiting{ CGRect frame = CGRectMake(0, -20, 320, 480); int x = frame.size.width; int progressWidth = 150; int progressHeight = 32; frame = CGRectMake((x-progressWidth)/2, 100, progressWidth, progressHeight); UIProgressView *progress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar]; progress.frame = frame; progress.progress = 0.0; progress.backgroundColor = [UIColor whiteColor]; UILabel *showValue = [[UILabel alloc]init]; frame = showValue.frame; frame.origin.x = CGRectGetMaxX(progress.frame)+10; frame.origin.y = CGRectGetMinY(progress.frame); frame.size.width = 80; frame.size.height = 15; showValue.frame = frame; showValue.backgroundColor = [UIColor redColor]; showValue.text = @"0.0"; int progressIndWidth = 32; int progressIndHeight = 32; frame = CGRectMake((x-progressIndWidth)/2, 100+32, progressIndWidth, progressIndHeight); UIActivityIndicatorView *progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame]; [progressInd startAnimating]; progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; frame = CGRectMake((x-70)/2, 100+32+32, 80, 20); UILabel *waitinglabel = [[UILabel alloc]initWithFrame:frame]; waitinglabel.text = @"正在下载应用程序图片..."; waitinglabel.textColor = [UIColor redColor]; waitinglabel.font = [UIFont systemFontOfSize:15]; waitinglabel.backgroundColor = [UIColor clearColor]; frame = CGRectMake(0, 0, 320, 480); UIView *theView = [[UIView alloc]initWithFrame:frame]; theView.backgroundColor = [UIColor blackColor]; theView.alpha = 0.7; [progress setTag:100]; [theView addSubview:progress]; [showValue setTag:101]; [theView addSubview:showValue]; [theView addSubview:progressInd]; [theView addSubview:waitinglabel]; [theView setTag:110]; [self.view addSubview:theView]; } #pragma mark - ViewDidLoad -(void)viewDidLoad{ NSLog(@"%@",self.view.subviews); UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 200, 100); button.center = CGPointMake(self.view.center.x,self.view.center.y +100); [button addTarget:self action:@selector(downloadImage:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"下载图片" forState:UIControlStateNormal]; [self.view addSubview:button]; __weak typeof(self) weakSelf = self; self.downloadBlock = ^{ weakSelf.appImgView.image = weakSelf.image1; [NSTimer scheduledTimerWithTimeInterval:2.0 target:weakSelf selector:@selector(updateImage) userInfo:nil repeats:NO]; }; } - (void)updateImage{ self.appImgView.image = self.image2; } #pragma mark - clickAction - (void)downloadImage:(UIButton *)sender{ [self downloadImages]; } #pragma mark - DownLoadImages - (void)downloadImages { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 异步下载图片 dispatch_async(queue, ^{ // 创建一个组 dispatch_group_t group = dispatch_group_create(); __block UIImage *image1 = nil; __block UIImage *image2 = nil; // 关联一个任务到group dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 下载第一张图片 NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg"; image1 = [self imageWithURLString:url1]; }); // 关联一个任务到group dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 下载第一张图片 NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg"; image2 = [self imageWithURLString:url2]; }); // 等待组中的任务执行完毕,回到主线程执行block回调 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ self.image1 = image1; self.image2 = image2; self.downloadBlock(); // 千万不要在异步线程中自动释放UIImage,因为当异步线程结束,异步线程的自动释放池也会被销毁,那么UIImage也会被销毁 }); }); } - (UIImage *)imageWithURLString:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; NSData *data = [NSData dataWithContentsOfURL:url]; // 这里并没有自动释放UIImage对象 return [[UIImage alloc] initWithData:data]; } #pragma mark - DownLoadImageDelegate methods //展示下载完毕的图片 -(void)imageDownLoadFinished:(UIImage *)img{ //退出等待框 [self hiddenWaiting]; [self.appImgView setImage:img]; NSLog(@"%@",self.view.subviews); } //更新进度条的值 -(void)updateDownProgress:(double) value{ UIProgressView *progresss = (UIProgressView *)[self.view viewWithTag:100]; UILabel *showValue = (UILabel*)[self.view viewWithTag:101]; progresss.progress = value; showValue.text = [NSString stringWithFormat:@"%.1f%%",(double)(value*100)]; } //隐藏等待框 -(void)hiddenWaiting{ [[self.view viewWithTag:110]removeFromSuperview]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } @end
原文:http://www.cnblogs.com/yyzanll/p/4647430.html