转载

第一篇:NSOperation的概念

一、说明

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

打印结果:

第一篇:NSOperation的概念

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

打印结果:

第一篇:NSOperation的概念

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

打印结果:

第一篇:NSOperation的概念

注意:系统会自动将NSOperationQueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务并行执行的。(队列取出是有顺序的,与打印结果并不矛盾)

正文到此结束
Loading...