直接上代碼
示例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還有非常多復雜的功能
*/
新聞熱點
疑難解答