NSOperation与NSOperationQueue多线程的实现
2016-08-18 00:00
197 查看
除了使用GCD实现多线程之外,NSOperation与NSOperationQueue也是一种简单的多线程实现方式。
NSOperationQueue:代表一个FIFO的队列,负责管理系统提交的多个NSOperation,它会按照顺序启动线程来执行提交给改队列的NSOperation任务。
NSOperation:代表一个多线程的任务,使用方法有两种方式:a、实现NSOperation的子类,b、直接使用NSInvocationOperation或者NSBlockOperation
一、NSOperation
实现NSOperation的子类 NSOperation是没法直接使用的,它只是提供了一个工作的基本逻辑,具体实现还是需要你通过 定义自己的NSOperation子类来获得。创建NSOperation的子类需要重写一个方法:- (void)main,该方法的方法体将作为NSOperationQueue完成的任务。
创建VGOperation继承与NSOperation,实现一个加载图片的功能
.h
.m
使用的方法
NSInvocationOperation和NSBlockOperation的使用
NSInvocationOperation和NSBlockOperation都是NSOperation的子类,可以在程序中直接使用,用于封装需要异步执行的任务。NSInvocationOperation和NSBlockOperation使用方法很相似,NSInvocationOperation是将特定对象的特定方法封装成NSOperation对象,NSBlockOperation用于将代码块封装成NSOperation对象。
1、NSInvocationOperation
downloadTask方法完成之后回调Block中的代码。
2、NSBlockOperation
NSBlockOperation的使用有两种方式:
(1)、
(2)、
二、NSOperationQueue
NSOperationQueue由于添加到队列的方式不同,也可以分为两种:
这里以下载图片并显示出来为例,简单说下两种不同的方式
1、
2、
如果有多个NSOperation可以参照以上代码逐一添加。
NSOperationQueue:代表一个FIFO的队列,负责管理系统提交的多个NSOperation,它会按照顺序启动线程来执行提交给改队列的NSOperation任务。
NSOperation:代表一个多线程的任务,使用方法有两种方式:a、实现NSOperation的子类,b、直接使用NSInvocationOperation或者NSBlockOperation
一、NSOperation
实现NSOperation的子类 NSOperation是没法直接使用的,它只是提供了一个工作的基本逻辑,具体实现还是需要你通过 定义自己的NSOperation子类来获得。创建NSOperation的子类需要重写一个方法:- (void)main,该方法的方法体将作为NSOperationQueue完成的任务。
创建VGOperation继承与NSOperation,实现一个加载图片的功能
.h
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface VGOperation : NSOperation @property (nonatomic) NSURL *url; @property (nonatomic) UIImageView *imageView; - (instancetype)initWithUrl:(NSURL *)url imageView:(UIImageView *)imageView; @end
.m
#import "VGOperation.h" @implementation VGOperation - (instancetype)initWithUrl:(NSURL *)url imageView:(UIImageView *)imageView { self = [super init]; if (self) { _url = url; _imageView = imageView; } return self; } - (void)main{//作为NSOperationQueue完成的任务 NSData *data = [NSData dataWithContentsOfURL:self.url]; UIImage *image = [UIImage imageWithData:data]; if (image != nil) { [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];//回到主线程刷新UI } } - (void)updateUI:(UIImage *)image{ self.imageView.image = image; } @end
使用的方法
NSOperationQueue *queue = [[NSOperationQueue alloc]init];//创建 队列 NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"]; VGOperation *operation = [[VGOperation alloc]initWithUrl:url imageView:self.IM1];//创建任务,其中VGOperation继承与NSOperation [queue addOperation:operation];// 将任务添加到队列中
NSInvocationOperation和NSBlockOperation的使用
NSInvocationOperation和NSBlockOperation都是NSOperation的子类,可以在程序中直接使用,用于封装需要异步执行的任务。NSInvocationOperation和NSBlockOperation使用方法很相似,NSInvocationOperation是将特定对象的特定方法封装成NSOperation对象,NSBlockOperation用于将代码块封装成NSOperation对象。
1、NSInvocationOperation
NSInvocationOperation *oper = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadTask) object:nil]; [oper setCompletionBlock:^{ NSLog(@"完成了"); }]; [oper start]; - (void)downloadTask{ [NSThread sleepForTimeInterval:5]; }
downloadTask方法完成之后回调Block中的代码。
2、NSBlockOperation
NSBlockOperation的使用有两种方式:
(1)、
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //实现的代码.... }]; operation.completionBlock = ^{ NSLog(@"Operation completed"); }; [operation start];
(2)、
NSBlockOperation *op = [[NSBlockOperation alloc]init]; [op addExecutionBlock:^{ NSLog(@" --- "); }]; [op setCompletionBlock:^{ NSLog(@"完成了"); }]; [op start];
二、NSOperationQueue
NSOperationQueue由于添加到队列的方式不同,也可以分为两种:
这里以下载图片并显示出来为例,简单说下两种不同的方式
1、
NSOperationQueue *queue1 = [[NSOperationQueue alloc]init];//创建队列 [queue1 addOperationWithBlock:^{//添加任务到队列中 NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlArray[0]]]; UIImage *image1 = [[UIImage alloc]initWithData:data1]; [[NSOperationQueue mainQueue]addOperationWithBlock:^{//回到主线程刷新UI self.IM1.image = image1; }]; }];
2、
NSOperationQueue *queue3 = [[NSOperationQueue alloc]init];//创建队列 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlArray[0]]]; UIImage *image1 = [[UIImage alloc]initWithData:data1]; [[NSOperationQueue mainQueue]addOperationWithBlock:^{ self.IM1.image = image1; }]; }];//创建NSOperation任务 operation1.completionBlock = ^{ NSLog(@"Operation 1 completed"); };//任务完成回调 [queue3 addOperation:operation1];//将任务添加到队列中
如果有多个NSOperation可以参照以上代码逐一添加。
相关文章推荐
- iphone中使用NSoperation实现图片异步加载
- 使用NSOperation实现异步下载
- NSOperation的继承实现
- iOS-----使用NSOperation与NSOperationQueue实现多线程
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- 使用NSOperation与NSOperationQueue实现多线程
- iOS NSOperation 封装 通知实现界面更新
- Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue
- iOS中另外一种多线程实现方式NSOperation
- 使用NSOperation实现异步下载
- 使用NSOperation+NSOperationQueue实现多任务网络连接
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- 使用NSOperation实现异步下载
- NSOperation 实现 HTTP多线程访问
- 使用NSoperation 实现异步加载图片
- 使用NSOperation和NSOperationQueue用来实现多线程
- 封装思想之:NSoperation的自定义实现
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例