NSOperation使用

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:];
//设置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:];
} //收到响应
- (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==?:((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(, , frame.size.width, frame.size.height);
_appImgView = [[UIImageView alloc]initWithFrame:frame];
[self.view addSubview:_appImgView];
} //展示等待框
-(void)showWaiting{
CGRect frame = CGRectMake(, -, , );
int x = frame.size.width; int progressWidth = ;
int progressHeight = ;
frame = CGRectMake((x-progressWidth)/, , 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)+;
frame.origin.y = CGRectGetMinY(progress.frame);
frame.size.width = ;
frame.size.height = ;
showValue.frame = frame;
showValue.backgroundColor = [UIColor redColor];
showValue.text = @"0.0"; int progressIndWidth = ;
int progressIndHeight = ;
frame = CGRectMake((x-progressIndWidth)/, +, progressIndWidth, progressIndHeight);
UIActivityIndicatorView *progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame];
[progressInd startAnimating];
progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; frame = CGRectMake((x-)/, ++, , );
UILabel *waitinglabel = [[UILabel alloc]initWithFrame:frame];
waitinglabel.text = @"正在下载应用程序图片...";
waitinglabel.textColor = [UIColor redColor];
waitinglabel.font = [UIFont systemFontOfSize:];
waitinglabel.backgroundColor = [UIColor clearColor]; frame = CGRectMake(, , , );
UIView *theView = [[UIView alloc]initWithFrame:frame];
theView.backgroundColor = [UIColor blackColor];
theView.alpha = 0.7; [progress setTag:];
[theView addSubview:progress];
[showValue setTag:];
[theView addSubview:showValue]; [theView addSubview:progressInd];
[theView addSubview:waitinglabel]; [theView setTag:];
[self.view addSubview:theView];
} #pragma mark - ViewDidLoad -(void)viewDidLoad{
NSLog(@"%@",self.view.subviews);
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(, , , );
button.center = CGPointMake(self.view.center.x,self.view.center.y +);
[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, ); // 异步下载图片
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, ), ^{
// 下载第一张图片
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, ), ^{
// 下载第一张图片
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:];
UILabel *showValue = (UILabel*)[self.view viewWithTag:];
progresss.progress = value;
showValue.text = [NSString stringWithFormat:@"%.1f%%",(double)(value*)];
} //隐藏等待框
-(void)hiddenWaiting{
[[self.view viewWithTag:]removeFromSuperview];
} - (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} @end
上一篇:网页缩放对 FLASH的影响


下一篇:Hibernate update 和 merge 、saveOrUpdate的区别