#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
#warning mark nsoperation 本身不是線程,他只是封裝了一定的代碼段和數(shù)據(jù)去實現(xiàn)一個功能
- (IBAction)invocationOP:(UIButton *)sender {
NSInvocationOperation *invocation =[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(text) object:nil];
[invocation start];
}
//nsblock
- (IBAction)blockOP:(UIButton *)sender {
NSBlockOperation *block =[NSBlockOperation blockOperationWithBlock:^{
[self text];
}];
[block start];
}
//線程隊列(!!!!!子線程隊列是無序的)
- (IBAction)opretionqu:(UIButton *)sender {
//創(chuàng)建一個子線程隊列(并發(fā))(不需要我們在去手動開啟)
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
/* 依賴關(guān)系:(1)可保證執(zhí)行順序,(2)可以跨隊列,而串行隊列是不可以夸隊列,如最后跟新UI則變成了在主隊列朱,這是NSoperationqueue的優(yōu)勢
*/
//? ? NSBlockOperation *op1 =[NSBlockOperation blockOperationWithBlock:^{
//? ? ? ? NSLog(@"下載圖片%@",[NSThread currentThread]);
//? ? }];
//? ? NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{
//? ? ? ? NSLog(@"國棟開始P圖%@",[NSThread currentThread]);
//? ? }];
//? ? NSBlockOperation *op3=[NSBlockOperation blockOperationWithBlock:^{
//? ? ? ? NSLog(@"保存圖片%@",[NSThread currentThread]);
//? ? }];
//
//? ? NSBlockOperation *op4=[NSBlockOperation blockOperationWithBlock:^{
//? ? ? ? NSLog(@"刷新UI%@",[NSThread currentThread]);
//? ? }];
//添加依賴關(guān)系(依賴關(guān)系要添加到添加隊列之前)
//? ? [op2 addDependency:op1];//也就是下載結(jié)束了之后再對圖片進行修改,一種依賴關(guān)系;
//? ? [op3 addDependency:op2];
//? ? [op4 addDependency:op3];//夸隊列添加依賴關(guān)系;
//? ? //設(shè)置最大并發(fā)數(shù),也就是說當(dāng)前對列最多由幾個線程同時執(zhí)行,一般情況下,設(shè)置為二或三(設(shè)置為0時,相當(dāng)于不執(zhí)行)
//? ? queue.maxConcurrentOperationCount =2;
//? ? //吧op1 op2 op3 添加到隊列
//? ? [queue addOperation:op1];
//? ? [queue addOperation:op2];
//? ? [queue addOperation:op3];
//? ? //把OP4添加到主線程中
//? ? [[NSOperationQueue mainQueue] addOperation:op4];
NSBlockOperation *op1 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1");
}];
NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2");
}];
NSBlockOperation *op3 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3");
}];
NSBlockOperation *op4 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"4");
}];
NSBlockOperation *op5 =[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"5");
}];
NSBlockOperation *op6=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"6");
}];
[op2 addDependency:op1];
[op3 addDependency:op2];
[op6 addDependency:op3];
[op4 addDependency:op6];
[op5 addDependency:op4];
//? ? [op6 addDependency:op5];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue addOperation:op4];
[queue addOperation:op5];
[[NSOperationQueue mainQueue]addOperation:op6];
}
-(void)text{
NSLog(@"%@,%d",[NSThread currentThread],[[NSThread currentThread]isMainThread]);
}