#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSOperationQueue *myQueue;
@end
@implementation ViewController
/**
*NSOperationQueue实例化的队列是并发队列
*
*并发队列+异步操作
*/
- (NSOperationQueue *)myQueue
{
if (_myQueue == nil)
{
_myQueue = [[NSOperationQueue alloc] init];
}
return _myQueue;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self opDemo];
}
#pragma mark- 同时并发线程的数量
- (void)opDemo
{
//gcd中,线程的开启数量是由gcd底层决定的,程序员不能参与
//NSOperation提供一个属性最大并发数量
self.myQueue.maxConcurrentOperationCount = 8;
for (int i = 0; i < 100; ++i)
{
[self.myQueue addOperationWithBlock:^{
NSLog(@"%@ %d", [NSThread currentThread], i);
}];
}
}
#pragma mark- 队列的暂停和继续
- (void)pause
{
//先判断队列中是否有操作
if (self.myQueue.operationCount == 0)
{//队列中无操作
NSLog(@"无操作");
return;
}
//挂起-等同于暂停,暂停的时队列,让队列不再派发任务
NSLog(@"暂停");
[self.myQueue setSuspended:YES];
}
- (void)resume
{
//先判断队列中是否有操作
if (self.myQueue.operationCount == 0)
{//队列中无操作
NSLog(@"无操作");
return;
}
NSLog(@"继续");
[self.myQueue setSuspended:NO];
}
#pragma mark- 操作的依赖->操作的执行顺序
- (void)demo3
{
/*
1.下载电影压缩包
2.解压缩
3.保存文件
4.通知用户
*/
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载电影压缩包 %@", [NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压缩 %@", [NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"保存文件 %@", [NSThread currentThread]);
}];
NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"通知用户 %@", [NSThread currentThread]);
}];
[op2 addDependency:op1];
[op3 addDependency:op2];
[op4 addDependency:op3];
[self.myQueue addOperations:@[op1, op2, op3] waitUntilFinished:NO ];
[[NSOperationQueue mainQueue] addOperation:op4];
}
@end