操作队列

操作队列Operation Queue

操作队列是Cocoa对GCD公开的队列模型的一个抽象。GCD提供更底层一些的控制,相对而言,操作队列在他之上实现了许多更便捷易用的特性,所以通常对应用开发者来说操作队列是最好也是最安全的选择。

NSOperationQueue类有两种类型的队列:主队列和自定义队列。主队列在主线程中运行,自定义队列在后台运行。不管是哪种队列,都是NSOperation的子类。

你可以通过两种方式来定义你的操作:重写main函数,或重写start函数。前者非常容易操作,但灵活性差一些。在这种方式中,你不需要去管理像isExecuting和isFinished这样的状态属性,可以简单认为当main返回时操作就完成了。

1
2
3
4
5
6
@implementation YourOperation
     - ( void )main
     {
         // do your work here ...
     }
@end

如果你想有更多控制权以及想在操作中执行异步任务,你可以重写start函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@implementation YourOperation
     - ( void )start
     {
         self.isExecuting = YES;
         self.isFinished = NO;
         // start your work, which calls finished once it's done ...
     }
 
     - ( void )finished
     {
         self.isExecuting = NO;
         self.isFinished = YES;
     }
@end

注意在这种方式中,你必须手动管理操作的状态。为了让操作队列能捕捉到这些状态的变化,状态属性要定义成与KVO兼容。所以,确保在你不通过默认的访问函数去设置他们的值时要发送合适的KVO消息。

操作队列支持取消机制,故你进行操作时需要例行检查isCancelled属性以判断是否继续运行。

1
2
3
4
5
6
- ( void )main
{
     while (notDone && !self.isCancelled) {
         // do your processing
     }
}

定义好了你的操作类(NSOperation操作类的子类)后,往队列里添加操作就非常简单了:

1
2
3
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
YourOperation *operation = [[YourOperation alloc] init];
[queue  addOperation:operation];

另外,你也可以往操作队列中添加代码块。这非常简单,例如:你想在主队列中调度一个一次性任务:

1
2
3
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
     // do something...
}];

虽然代码块的方式可以很放方便地在队列中安排任务,但定义NSOperation操作类的子类的方式非常有助于调试。如果你重写了操作类的description方法,你可以很容易地识别出安排在某个队列中的全部操作。

除了用队列安排operation或代码块这些基本操作外,operation queue还提供了一些GCD难以做好的功能。例如,你可以通过设置maxConcurrentOperationCount属性轻松地控制一个queue中有多少个operation能被同时执行,设为1的时候变成一个串行队列,可用于实现隔离的目的。

另一个方便的功能是根据队列中operation的优先级对其进行排序,这不同于GCD的队列优先级,它只会影响到一个队列中所有operation的执行顺序。如果你需要对超过那五个标准优先级的操作有更多的控制权,你可以像这样指定他们之间的依赖关系:

1
2
3
[intermediateOperation addDependency:operation1];
[intermediateOperation addDependency:operation2];
[finishedOperation addDependency:intermediateOperation];

这段简单的代码保证了operation1和operation2都将在intermediateOperation之前执行。操作间的依赖关系是非常强大的机制,可用来指定一种良好的执行顺序。你能创建一个操作组,让它们在依赖它们的操作前被执行,或者在并发队列中顺序执行操作。

从本质上说,operation queue的性能稍逊于GCD,但在大多数情况下这可以忽略不计,operation queue是并发编程的首选。


转自:http://blog.jobbole.com/52647/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值