一、说明
NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程
NSOperation和NSOperationQueue实现多线程的具体步骤:
1.先将需要执行的操作封装到一个NSOperation对象中
2.然后将NSOperation对象添加到NSOperationQueue中
3.系统会自动将NSOperationQueue中的NSOperation取出来
4.会将封装好的NSOperation进行操作放到一天新的线程中执行
二、次要
NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
使用方式有3种:
1.NSInvocationOperation
2.NSBlockOperation
3.自定义子类继承NSOperation,实现内部相应的方法
三、具体说明
1.NSInvocatioO
//创建操作对象,封装要执行的任务
//NSInvocationOperation 封装操作
NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
//执行操作
[operation start];
peration子类的创建和执行操作
注意:
1.一旦执行操作,就会调用target的test方法
2.操作对象默认在主线程中执行,只有添加到队列才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行的,只是将NSOperation放到了一个NSOperationQueue中,才会异步执行操作。
//
// ViewController.m
// 01-NSOperation基本1
//
// Created by on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//NSOperation:抽象类,不具备封装功能
//创建操作对象,封装要执行的任务
//NSInvocationOperation 封装操作
NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
//执行操作
[operation start];
}
-(void)test
{
NSLog(@"--test--%@--",[NSThread currentThread]);
}
@end
打印结果:
2.NSBlckOperation子类创建对象和添加操作:
//创建NSBlockOperation操作对象
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//......
}];
//添加操作
[operation addExecutionBlock:^{
//....
}];
显示代码:
//
// ViewController.m
// 02-NSTherad基本2
//
// Created by on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//创建NSBlockOperation操作对象
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
}];
//开启执行操作
[operation start];
}
@end
打印结果:
3.NSOperationQueue的作用:NSOperation可以调用start方法来执行任务,但默认是同步执行的如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作添加操作NSOperationQueue中,自动开启线程。
//创建NSOperationQueue
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
//把操作添加到队列中
//第一种方式
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
//第二种方式
[queue addOperationWithBlock:^{
NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
}];
-(void)addOperation:(NSOperation*)op;
-(void)addOperationWithBlock:(^)(void)block;
代码示例:
//
// YYViewController.m
// 03-NSOperation基本3
//
// Created by 孔医己 on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "YYViewController.h"
@interface YYViewController ()
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//创建NSInvocationOperation对象,封装操作
NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
//创建对象,封装操作
NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
}];
[operation3 addExecutionBlock:^{
NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
}];
//创建NSOperationQueue
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
//把操作添加到队列中
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
}
-(void)test1
{
NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
}
-(void)test2
{
NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
}
@end
打印结果:
注意:系统会自动将NSOperationQueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务并行执行的。(队列取出是有顺序的,与打印结果并不矛盾)