首页 > 技术文章 > UI进阶之多线程(NSOperation)

huyibo 2016-04-09 10:50 原文

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
#pragma mark --NSInvocationOperation方法--
    //NSOperation 是一个抽象类 不能直接使用
    //通过NSInvocationOperation 类来创建以一个NSOperation对象
    //NSOperation 类及其子类本身不会进行线程的创建
    
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(hehe) object:nil];
    
    //operation在单独使用的时候 一定要调用开始方法
   // [operation start];
    
    
#pragma mark -- NSBlockOperation方法--
    
    //使用NSBlockOperation 创建一个NSOperation对象
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        
        NSLog(@" main2 == %@", [NSThread mainThread]);
        
        NSLog(@"current2 ==%@", [NSThread currentThread]);
        
        NSLog(@"bbb");
        
    }];
    
   // [blockOperation start];
    
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //给两个任务添加一个依赖关系 这两个任务就会按照依赖关系顺序执行
    [operation addDependency:blockOperation];
  
//    queue.maxConcurrentOperationCount = 2;
    
    [queue addOperation:operation];
    [queue addOperation:blockOperation];
    
    //获取系统提供的主队列
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    //NSOperationQueue 是一个队列管理器, 可以根据operation 任务自己分配线程, 自己管理线程的生命周期
    //在开发过程中,我们不需要管理线程的创建和销毁
    //NSOperationQueue 创建的是n个并行的线程
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //最大线程并发数
    //maxConcurrentOperationCount 表示同时执行任务的最大数量
    //即使只执行一个任务, 系统有的时候也会开辟多个线程去执行这个任务
    queue.maxConcurrentOperationCount = 1;
    
    for (int i = 0; i < 10; i++) {
        
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
           
            NSLog(@"current%d = %@", i, [NSThread currentThread]);
            
            
            
        }];
        
        
        [queue addOperation:operation];
    }
   
}

- (void)hehe
{
    NSLog(@" main == %@", [NSThread mainThread]);
    
    NSLog(@"current ==%@", [NSThread currentThread]);
    NSLog(@"

推荐阅读