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

NSOperation使用的更多相关文章

  1. iOS多线程之9.自定义NSOperation

      本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例. 新建一个类,继承于NSOperation. CustomOperation.h 代码 ...

  2. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  3. iOS多线程之7.NSOperation的初识

    NSOperation和GCD一样,不用我们管理线程的生命周期,加锁等问题,只要把操作封装进NSOperation中,系统会自动帮我们创建线程,执行操作.而且他是面向对象的,我们看起来更容易理解,使用 ...

  4. 4.4 多线程进阶篇<下>(NSOperation)

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人"简书" 本文源码 Demo 详见 Github https://github.c ...

  5. 认识和使用NSOperation

    原文链接:http://www.jianshu.com/p/2de9c776f226 NSOperation是OC中多线程技术的一种,是对GCD的OC包装.它包含队列(NSOperationQueue ...

  6. 多线程下NSOperation、NSBlockOperation、NSInvocationOperation、NSOperationQueue的使用

    本篇文章主要介绍下多线程下NSOperation.NSBlockOperation.NSInvocationOperation.NSOperationQueue的使用,列举几个简单的例子. 默认情况下 ...

  7. iOS NSOperation 封装 通知实现界面更新

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface MYOperation : NSOpe ...

  8. iOS NSOperation 异步加载图片 封装NSOperation 代理更新

    #import <Foundation/Foundation.h> @class MYOperation; @protocol MYOperationDelecate <NSObje ...

  9. 3.多线程NSOperation

    1.NSOperation的基本操作 使用NSOperation的两个子类,NSInvocationOperation 和 NSBlockOperation 创建操作,然后将操作添加到队列中去执行 / ...

  10. NSOperation的start与main,并发与非并发。

    http://blog.csdn.net/a2331046/article/details/52294006 在ios4以前,只有非并发的情况下,队列会为operation开启一个线程来执行.如果是并 ...

随机推荐

  1. C#网络爬虫 WebUtility使用 转义字符 urlCode

    背景: 在C#写网络爬虫时候,有时候需要将html中的转义字符进行处理,还有网址中的中文处理 一.html转义字符处理 1.ASP.NET中的html解析 HttpUtility.HtmlDecode ...

  2. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  3. Docker 容器测试全探索

    导读 当我们构建好Docker镜像并利用多套容器共同组合成应用程序,建立起持续交付通道,了解了如何将新创建的镜像纳入到生产或者测试环境当中之后,新的问题来了——我们该如何测试自己的Docker容器?测 ...

  4. Unable to locate player settings. bin/Data/settings.xml

    Hello guys, so according to the this response: http://stackoverflow.com/a/18302624/5727136 you need ...

  5. 一个CMS案例实战讲解PHP代码审计入门

    前言 php代码审计介绍:顾名思义就是检查php源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞. 1.环境搭建: 工欲善其事必先利其器,先介绍代码审计必要的环境搭建 审计环境 window ...

  6. 使用jar命令打war包

    1.打开cmd进入web项目发布文件夹 2.,输入jar -cvf qxpt.war * (*表示当前目录下所有子目录) 3,回车等待执行完成就可以了 4.如果web项目发布文件夹有多个文件夹,而打w ...

  7. nginx配置多域名映射方法(本地hosts)

    本地测试网站的时候如果不想用localhost/xxxx的形式访问,可能就需要修改hosts文件来映射了,但是一个网站还好,假如有多个网站的话就不行了. 这时就需要配置多域名映射 比如hosts中配置 ...

  8. pip/matplot/pandas的安装和使用

    pip可以很方便的安装python的各种工具库,如pandas,matplotlib,scikit等,最大优点是它会自动解决库之间的依赖性,把所有需要的库都安装好,比起手工一个一个安装方便多了. 1. ...

  9. git stash简介

    原文:http://gitbook.liuhui998.com/4_5.html 一.基本操作 当你正在做一项复杂的工作时, 发现了一个和当前工作不相关但是又很讨厌的bug. 你这时想先修复bug再做 ...

  10. 第三方登录(QQ登录)开发流程详解

    原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...