您的位置:首页 > 产品设计 > UI/UE

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

#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可以参照以上代码逐一添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: