多线程之NSOperation

GCD与NSOperation的区别:

1.GCD是底层C语言构成的API

  NSOperation及其对象时ObjectiveC对象

  在GCD中执行队列中执行的是由block构成的任务,这是个轻量级的数据结构

  而NSOperation作为一个对象,为我们提供了更多的选择

2.在NSOperationQueue中的任务可以随时取消,GCD也可以但是需要大量复杂代码

3.NSOperation能方便设置依赖关系

4.NSOperation能应用KVO,监听任务是否完成,比GCD更有效管理后台任务

5.NSOperation可以在同一个队列中设置任务的优先级,GCD只能设置不同队列的优先级,如果要区分block任务的优先级需要大量复杂代码

6.对NSOperation类继承可以添加成员变量和成员方法


NSOperation本身是抽象基类,因此必须使用它的子类,子类有三种

1.NSInvocationOperation

2.NSBlockOperation

3.自定义

NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行

如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情

NSInvocationOperation:

[[NSInvocation alloc]initWith...];

[..  start];  //没有添加到NSOperationQueue就是在主线程中


NSBlockOperation:

[[NSBlockOperation blockOperationWithBlock:...]

[.. addExcutionBlock:..] //添加更多任务,即使没有放在NSOperationQueue中,当任务>1的时候,自动增加线程

[.. start]


队列:

[[NSOperationQueue alloc]init]

[.. addOperation:..] //自动执行,不用调用start了,自动开启线程

设置最大并发数: maxCurrentOperationCount

队列取消:cancelAllOperation

单个取消:-(void)cancel

暂停:setSuspened:(BOOL)

优先级: .priority

依赖:  [A addDependency:B] 表示B先执行再执行A

监听: .completionBlock


自定义NSOperation

重写- (void)main方法,在里面实现想执行的任务

重写- (void)main方法的注意点

自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)

经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值