直接上代码
示例1:
@interface TBViewController()
//队列
@property(nonatomic,strong)NSOperationQueue *queue;
@end
//队列的暂停和继续(在storyboard中拖两个按钮,分别为暂停、继续,连线)
//暂停
-(IBAction)pause
{
if(self.queue.operationCount == 0){
NSLog(@"无操作");
return;
}
//挂起》暂停 暂停的是队列,让队列暂时不再派发任务
NSLog(@"暂停");
[self.queue setSuspended:YES];
}
//继续
-(IBAction)resumue
{
if(self.queue.operationCount == 0){
NSLog(@"无操作");
return;
}
NSLog(@"继续");
[self.queue setSuspended:NO];
}
//懒加载
-(NSOperationQueue *)queue
{
if(_queue == nil){
_queue = [[NSOperationQueue alloc]init];
}
return _queue;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self opDemo1];
}
//同时并发线程数量
-(void)opDemo1
{
//线程开启的队列是由GCD底层决定的,程序员不能参与
/*
设置最大并发数的好处:线程开启有消耗
3G: 2~3条线程,线程少,流量少,省钱,省电
WIFI: 5~6条线程,线程多,效率高,流量大,不花钱,可以随时充电
*/
self.queue maxConcurrentOperationCount = 3;//最大并发数量
for(int i = 0;i < 100; i ++){
[self.queue addOperationWithBlock:^{
//阻塞
[NSThread sleepForTimeInterval:2];
NSLog(@"%@ %d",[NSThread currentThread];)
}];
}
}
示例2:操作的依赖-》操作的执行顺序
-(void)opDemo3
{
/*
例如:
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:op3];
[op4 addDependency:op3];
//循环依赖(一定不要出现)
[op1 addDependency:op4];
//异步的 waitUntilFinished 等待所有操作完成在继续
[self.queue addOperations:@[op1,op2,op3] waitUntilFinished:NO];
//主队列
[[NSOperationQueue mainQueue] addOperation:op4];
}
总结:
/*
NSOperation
1.是对GCD的封装
2、是OC的,面向对象的,使用更加容易
3、提供了一些特殊的方法,是GCD不容易实现的,例如:最大并发线程数量、暂停和继续
4、可以指定操作的依赖关系,依赖关系是可以跨队列的
5、自定义的队列,是并发队列,操作是异步任务
GCD
1、是C语言的,难度有点大
2、once
3、after
4、GCD还有非常多复杂的功能
*/