#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
原文:http://my.oschina.net/u/2410306/blog/529824