标签:
虽然 NSThread 能够实现多线程编程,但是需要自己去管理生命周期,还要考虑线程同步,加锁等问题.就会造成性能上的开销.
NSOpreation 和NSOpreationQueue就可以实现多线程编程,不用考虑线程的生命周期,同步,加锁等问题.
操作对象和操作队列
步骤:1.先把你要执行的任务,封装到NSOpreation对象里面.
2.要把NSOpreation对象添加到NSOpreationQueue中;
3.系统就会自动开辟线程,执行这些操作.
NSOpreation的使用:
NSOpreation并不具备封装操作的能力,必须使用它的子类.
1.NSInvocationOpretaion
2.NSBlockOpreation
3.自定义子类继承NSOpreation,实现相关方法.
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"主线程是%@",[NSThread currentThread]);
/*
1.NSInvocationOpretaion的使用
*/
//初始化创建NSInvocationOpretaion对象
//基于一个对象和seldctor创建
NSInvocationOperation *invocOp= [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run:) object:@"Woo"];
//调用start方法,就会运行绑定的@selector
//默认情况下,不会开启一个新的线程去执行,而是在当前线程同步执行,只有将他放入队列里面,才会异步操作.
[invocOp start];
//2.NSBlockOpreation的使用:
//初始化创建一个NSBlockOpreation对象,通过一个block来封装你要执行的任务.
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOpreation开始执行!");
}];
//在当前线程中执行,并不会异步执行,因为没有把他放入队列中.
[blockOp start];
//并发执行多个操作
NSBlockOperation *allOp = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"执行1次操作的线程是:%@",[NSThread currentThread]);
}];
//添加新的操作任务
[allOp addExecutionBlock:^{
NSLog(@"二次执行1次操作的线程是:%@",[NSThread currentThread]);
}];
[allOp addExecutionBlock:^{
NSLog(@"三次执行1次操作的线程是:%@",[NSThread currentThread]);
}];
[allOp start];
/*
并发执行就会开辟不同的线程
我们通过打印就会发现,操作任务会在不同的线程执行.
*/
//NSOpreation的其他相关使用,
/*
1.取消操作调用[opreation cancel]
2.执行完操作之后做一些事情
opreation.completionBlock=^(){
执行完毕会调用这个block
}
*/
}
-(void)run:(NSString*)str
{
NSLog(@"%@开始运行",str);
NSLog(@"当前线程是%@",[NSThread currentThread]);
}
标签:
原文地址:http://www.cnblogs.com/hl201504/p/4431384.html