首页 > 代码库 > 多线程 NSOpeartion 的使用
多线程 NSOpeartion 的使用
NSOperation简介
相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强
NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 NSOpeationQueue 来实现多线程操作
//验证: 没有队列时, 同步执行
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3d1d81 } p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } span.s1 { } span.s2 { font: 18.0px "PingFang SC" } span.s3 { color: #c32275 } span.s4 { color: #000000 } span.s5 { color: #3d1d81 } span.s6 { color: #c91b13 } span.s7 { color: #6122ae } span.s8 { font: 18.0px Menlo; color: #000000 } span.s9 { font: 18.0px Menlo }</style>//子类 NSBlockOperation
//NSBlockOperation还提供了一个方法addExecutionBlock:
//额外添加 block 任务
- (void)blockOperation{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------%@", [NSThread currentThread]);
}];
// 添加额外的任务(在子线程执行)
[op addExecutionBlock:^{
NSLog(@"2------%@", [NSThread currentThread]);
}];
[op addExecutionBlock:^{
NSLog(@"3------%@", [NSThread currentThread]);
}];
[op addExecutionBlock:^{
NSLog(@"4------%@", [NSThread currentThread]);
}];
//直接执行,没有放到 queue 中,不会开启新线程,在主线程中执行
[op start];
}
一.使用步骤:
1.创建队列
2.创建任务
3.将任务添加到队列中(异步执行, 开启新线程)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae } p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa } p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3d1d81 } span.s1 { font: 18.0px Menlo } span.s2 { } span.s3 { color: #c32275 } span.s4 { color: #000000 } span.s5 { font: 18.0px "PingFang SC" } span.s6 { color: #3d1d81 } span.s7 { color: #0435ff } span.s8 { color: #c91b13 } span.s9 { color: #6122ae } span.s10 { font: 18.0px Menlo; color: #000000 }</style>//任务 添加 到队列中
//在队列中 会 开启新线程
- (void)addTaskToQueue{
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 2. 创建操作
// 创建NSInvocationOperation
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
// 创建NSBlockOperation
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2-----%@", [NSThread currentThread]);
}
}];
//--添加依赖
//2 依赖1 ,则必须 1 完成之后,才会执行2
[op2 addDependency:op1];
//--设置最大并发数
// queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列
queue.maxConcurrentOperationCount = 2;
//3.将任务添加到队列中
[queue addOperation:op1];
[queue addOperation:op2];
//4.不需要创建任务,queueu直接添加 block 任务
[queue addOperationWithBlock:^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3-----%@", [NSThread currentThread]);
}
}];
}
二.特性方法
1.任务之间可以添加依赖
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px } span.s1 { } span.s2 { font: 18.0px "PingFang SC" } span.s3 { color: #000000 } span.s4 { color: #3d1d81 }</style>//--添加依赖
//2 依赖1 ,则必须 1 完成之后,才会执行2
[op2 addDependency:op1];
2.队列可以设置最大并发数
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa } span.s1 { color: #000000 } span.s2 { } span.s3 { font: 18.0px "PingFang SC" } span.s4 { color: #0435ff }</style>//--设置最大并发数
// queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列
queue.maxConcurrentOperationCount = 2;
三.其他方法
- (void)cancel;
NSOperation提供的方法,可取消单个操作- (void)cancelAllOperations;
NSOperationQueue提供的方法,可以取消队列的所有操作- (void)setSuspended:(BOOL)b;
可设置任务的暂停和恢复,YES代表暂停队列,NO代表恢复队列-
- (BOOL)isSuspended;
判断暂停状态
注意: 暂停 和 取消 并不代表可以将当前的操作 立即取消或暂停, 而是将当前的操作执行完成之后, 不再执行其他的新操作了
暂停与取消的 区别: 是否可以继续向下执行
多线程 NSOpeartion 的使用