#import "ViewController.h" @interface ViewController () { NSOperationQueue *_queue; } @end @implementation ViewController /* 第二種 多線程技術 任務 NSOperation NSOperation是一個抽象類(當前類只聲明方法不實現,由子類實現方法),建立任務咱們須要建立NSOperation的子類對象 建立任務以後,須要把任務放入任務隊列/線程池中 纔會異步執行任務 */ - (void)viewDidLoad { [super viewDidLoad]; //建立一個線程池 _queue = [[NSOperationQueue alloc] init]; //設置 最大併發任務的個數 //最多容許多少個線程同時進行(異步執行) _queue.maxConcurrentOperationCount = 2; //若是設置爲1 那麼 線程池中的子任務之間就是串行執行(子線程之間同步) //第一種任務 //[self creatOperation1]; //第二種 //[self creatBlockOperation]; //第三類 //直接向線程池 添加 block 任務 [_queue addOperationWithBlock:^{ NSLog(@"block任務2"); for (NSInteger i = 0 ; i < 30; i ++) { [NSThread sleepForTimeInterval:0.2]; NSLog(@"block2:%ld",i); } }]; } #pragma mark - 帶block 的任務 - (void)creatBlockOperation { //建立一個block 任務 NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"block 任務1"); for (NSInteger i = 0; i < 10; i++) { [NSThread sleepForTimeInterval:0.5]; NSLog(@"block1:-》i = %ld",i); } }]; //任務1結束以後會回調 下面的block [blockOp1 setCompletionBlock:^{ NSLog(@"block 任務1結束"); }]; //放入 線程池 [_queue addOperation:blockOp1]; } #pragma mark - 請求任務 - (void)creatOperation1 { //建立一個任務 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation1:) object:@"任務1"]; //[op1 start];任務中start 表示 同步執行 //要想異步執行任務 須要放入線程池中 ,一旦放入線程池會當即異步執行 [_queue addOperation:op1]; //多增長几個任務 NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation2:) object:@"任務2"]; //放入線程池 [_queue addOperation:op2]; NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation3:) object:@"任務3"]; //放入線程池 [_queue addOperation:op3]; } - (void)operation1:(id)obj { NSLog(@"func:%s obj:%@",__func__,obj); for (NSInteger i = 0; i < 10; i++) { NSLog(@"i:%ld",i); [NSThread sleepForTimeInterval:0.5]; } NSLog(@"任務1即將結束"); } - (void)operation2:(id)obj { NSLog(@"func:%s obj:%@",__func__,obj); for (NSInteger i = 0; i < 10; i++) { NSLog(@"i:%ld",i); [NSThread sleepForTimeInterval:0.5]; } NSLog(@"任務2即將結束"); } - (void)operation3:(id)obj { NSLog(@"func:%s obj:%@",__func__,obj); for (NSInteger i = 0; i < 10; i++) { NSLog(@"i:%ld",i); [NSThread sleepForTimeInterval:0.5]; } NSLog(@"任務3即將結束"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end