IOS多线程--NSOperation\NSOperationQueue

iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术

    1.GCD是纯C的,对面向对象的程序员不友好

    2.GCD对编程管理还不是很强大

 

    NSOperation 其实底层实现是基于GCD来做的

    dispatch_queue_t ==  NSOperationQueue

    dispatch_async == NSOperation

    dispatch_sync  == NSOperation

 

    NSOperation是个抽象类

    使用它的两个子类

    NSInvocationOperation

    NSBlockOperation

默认是在主线程上执行,会阻塞主线程

1.申请一个任务(self 响应的eat方法)

NSInvocationOperation *iop = [[NSInvocationOperation alloc]initWithTarget

  执行任务 [iop start];

 

2.block任务,直接使用,默认也是主线程

(1)addExecutionBlock能够实现并发执行,有新线程产生

     NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{

¥如果创建时没有执行任务、用addExecutionBlock添加的第一个任务也是主线程执行的、第二个才是新线程、

(2)添加执行block

[bop addExecutionBlock:^{

(3)完成任务给个回调、回调后面的便不再执行、不往下走了

bop.completionBlock = ^{

但是、start还是执行的、start必须存在、不然整个NSBlockOperation都不执行

这些任务都是在start之前执行的

 

    执行任务[bop start];

 

NSOperationQueue管理任务

1、一旦把任务交给队列管理、任务就是并发的

2、任务都是在子线程中完成的

3、不需要调用start方法、自动就会执行

 

(1)创建 alloc init

(2)在同一时刻并发执行的最大数量,这一点就完胜GCD,需要在添加任务之前设定 

queue.maxConcurrentOperationCount = 2;

(3)把任务交给队列管理

[queue addOperation:iop1];

    [queue addOperation:iop2];

或者

参数:waitUntilFinished是否等待队列任务都完成后 再往后执行

    [queue addOperations:@[iop2,iop1] waitUntilFinished:NO];

 

控制NSOperationQueue顺序

可一个给任务添加依赖关系、相当于间接的设定了任务的顺序(串行)

(1)依赖关系必须添加到任务提交之前

[iop1 addDependency:iop2];(iop1依赖于iop2,那么2先,1后)

(2)挂起主线程,等待所有的任务都完成,主线程才能继续执行,只要有没完成的,方法就不返回

[queue waitUntilAllOperationsAreFinished];

¥waitUntilFinished:NO  和   waitUntilAllOperationsAreFinished

都是控制主线程也就是NSOperationQueue之外的任务是否立即执行还是等待队列中任务完成后执行

(3)暂停

[self.queue setSuspended:YES];

1.正在执行的任务不会受暂停影响

    2.只有还没执行的任务才能被操控

    3.NSOperationQueue默认是并发的,需要设置依赖关系才能出现没执行的任务,才能做暂停操控

(4)继续

[self.queue setSuspended:NO];

(5)只能取消未执行的任务,取消后不能继续

[self.queue cancelAllOperations];

 

转载于:https://www.cnblogs.com/gaduo/p/4996561.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值