码迷,mamicode.com
首页 > 编程语言 > 详细

NSOperationQueue线程池应用

时间:2015-11-13 13:19:56      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

#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


NSOperationQueue线程池应用

标签:

原文地址:http://my.oschina.net/u/2410306/blog/529824

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!