一、简介
NSOperationQueue是用来管理NSOperation对象执行的一个集合类。一个应用中可以创建多个queue,而每个queue中可以有多个operation并行执行。
**注意:**queue中的operation的执行顺序和依赖关系以及operation的优先级有关。
二、创建queue
//创建一个操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
三、往queue中添加operation对象
// 添加operation到队列中
[queue addOperation:operation];
// 添加一组操作到队列中
[queue addOperations:operations waitUntilFinished:NO];
// 添加一个block形式的operation到队列中
[queue addOperationWithBlock:^{
NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]);
}];
**注意:**operation对象最多只能添加到一个queue中,而且当operation处于正在执行或执行完成的状态时不能添加到queue。
四、queue的属相
1、queue的operations属性和operationCount属性
可以通过queue的operations属性和operationCount属性查看queue中的operation和queue中的operation数。
// 正在执行或等待执行的operation
NSLog(@"%@", queue.operations);
// 正在执行或等待执行的operation数
NSLog(@"%lu", queue.operationCount);
注意: operationCount返回的是queue中的瞬时情况,所以当你使用这个值的时候,实际的operation数可能是不同的。所以不要将这个值用于对象的枚举或其他的精确计算中。
2、设置queue的并行执行operation数
默认情况下queue中多个operation并行执行,我们可以通过maxConcurrentOperationCount方法修改queue中并行执行的operation数。
// 设置队列最大并发操作数量
queue.maxConcurrentOperationCount = 1;
[queue setMaxConcurrentOperationCount:1];
当然你也可以设置
NSOperationQueueDefaultMaxConcurrentOperationCount常量让并行执行的operation数由queue动态确定。
3、暂停queue
使用suspended属性或者setSuspended方法可以暂时停止一个queue中等待的任务,但是不会暂停正在执行的operation的任务。
这个属性是一个bool值,当设置为NO的时候queue是活跃的,而设置为YES的时候queue将暂停。
// 暂停queue
[queue setSuspended:YES];
queue.suspended = YES;
// 恢复queue
[queue setSuspended:NO];
queue.suspended = NO;
五、queue的一些常用方法
1、取消queue中的operation
添加到queue中的operation是不能删除的,但是可以使用NSOperation的cancel方法取消这个operation,或者使用NSOperationQueue的cancelAllOperations方法取消全部
operation
// 取消单个操作
[operation cancel];
// 取消全部操作
[queue cancelAllOperations];
2、等待operation完成
如果需要在当前线程中处理operation完成后的结果,可以使用NSOperation的waitUntilFinished方法阻塞当前线程,等待operation完成。也可以同时等待一个queue中的所有操作完成,使用NSOperationQueue的waitUntilAllOperationsAreFinished方法。
注意:这样做的话会引入了更多的串行代码,限制了整个应用的并发性,同时也降低了用户体验。
// 阻塞当前线程,等待某个operation完成
[operation waitUntilFinished];
// 阻塞当前线程,等待某个queue的所有操作完成
[queue waitUntilAllOperationsAreFinished];
注意:在等待一个queue的期间,当前线程不能添加operation到queue中,但其他线程可以,因此可能会加长线程的等待时间。