多线程——NSOperationQueue

一、简介

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中,但其他线程可以,因此可能会加长线程的等待时间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值