您的位置:首页 > 产品设计 > UI/UE

多线程——NSOperationQueue

2016-03-25 18:37 411 查看

一、简介

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中,但其他线程可以,因此可能会加长线程的等待时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: