NSOperation 详解

一、多线程实现:

NSOperation和NSOperationQueue实现多线程的具体步骤:



(1)先将需要执行的操作封装到一个NSOperation对象中


(2)然后将NSOperation对象添加到NSOperationQueue中


(3)系统会⾃动将NSOperationQueue中的NSOperation取出来


(4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏



二、NSOperation的子类


NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类


使用NSOperation⼦类的方式有3种:


(1)NSInvocationOperation
需要传入一个方法名。

  //1.创建NSInvocationOperation对象
  NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
  //2.开始执行
  [operation start];

通过调用start方法来执行任务,默认是同步执行的。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作 。


(2)NSBlockOperation
需要传递一个Block实现。

 //1.创建NSBlockOperation对象
 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        //......
 }];
 //2.开始任务
 operation.start()
通过调用start方法来执行任务,默认是同步执行的。

但是 NSBlockOperation 还有一个方法:addExecutionBlock: ,通过这个方法可以给 Operation 添加多个执行 Block。

这样 Operation 中的任务 会并发执行,它会 在主线程和其它的多个线程 执行这些任务。

即:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作。但是会在 当前线程和其他线程 中执行,也就是说还是会占用当前线程

如下:

//添加操作2
[operation addExecutionBlock:^{
//....
}];

//添加操作3
[operation addExecutionBlock:^{
//....
}];



(3)自定义子类继承NSOperation,实现内部相应的⽅法


三、NSOperationQueue队列

添加操作到NSOperationQueue中,自动执行操作,自动开启线程

1、主队列

NSOperationQueue *queue = [NSOperationQueue mainQueue];
2、其他队列

其他队列的任务会在其他线程并行执行

//1.创建一个其他队列    
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//2.创建NSBlockOperation对象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@", [NSThread currentThread]);
}];

//3.添加多个Block
for (NSInteger i = 0; i < 5; i++) {
    [operation addExecutionBlock:^{
        NSLog(@"第%ld次:%@", i, [NSThread currentThread]);
    }];
}

//4.队列添加任务
[queue addOperation:operation];

四、提供的方法

1、线程数

NSOperationQueue有一个参数 maxConcurrentOperationCount 最大并发数,用来设置最多可以让多少个任务同时执行。当你把它设置为 1 的时候,他不就是串行了。

2、队列直接添加操作

  1. [queue addOperationWithBlock:^() {  
  2.     NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]);  
  3. }];  


3、设置依赖关系

  1. NSOperationQueue *queue = [[NSOperationQueue alloc] init];  
  2. NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){  
  3.     NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);  
  4. }];  
  5. NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){  
  6.     NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]);  
  7. }];  
  8. // operation1依赖于operation2  
  9. [operation1 addDependency:operation2];  
  10. [queue addOperation:operation1];  
  11. [queue addOperation:operation2];  
依赖关系不局限于相同queue中的NSOperation对象,NSOperation对象会管理自己的依赖,

 因此完全可以在不同的queue之间的NSOperation对象创建依赖关系。

4、优先级

可以通过setQueuePriority:方法来提升或降低operation对象的优先级。优先级只能应用于相同queue中的operations。


5、取消操作

  1. // 取消单个操作  
  2. [operation cancel];  
  3.   
  4. // 取消queue中所有的操作  
  5. [queue cancelAllOperations];  

6、暂停和继续queue

  1. // 暂停queue  
  2. [queue setSuspended:YES];  
  3.   
  4. // 继续queue  
  5. [queue setSuspended:NO];  
暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。


7、void (^completionBlock)(void); //用来设置完成后需要执行的操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值