NSOpreation+NSOpreationQueue

虽然 NSThread 能够实现多线程编程,但是需要自己去管理生命周期,还要考虑线程同步,加锁等问题.就会造成性能上的开销.

 NSOpreation 和NSOpreationQueue就可以实现多线程编程,不用考虑线程的生命周期,同步,加锁等问题.

 操作对象和操作队列

 

 

 步骤:1.先把你要执行的任务,封装到NSOpreation对象里面.

     2.要把NSOpreation对象添加到NSOpreationQueue中;

     3.系统就会自动开辟线程,执行这些操作.

 

 NSOpreation的使用:

    NSOpreation并不具备封装操作的能力,必须使用它的子类.

      1.NSInvocationOpretaion

      2.NSBlockOpreation

      3.自定义子类继承NSOpreation,实现相关方法.

- (void)viewDidLoad

{

    [super viewDidLoad];

 

    NSLog(@"主线程是%@",[NSThread currentThread]);

    /*

     1.NSInvocationOpretaion的使用

     

     */

    //初始化创建NSInvocationOpretaion对象

    //基于一个对象和seldctor创建

    NSInvocationOperation *invocOp= [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run:) object:@"Woo"];

    //调用start方法,就会运行绑定的@selector

    //默认情况下,不会开启一个新的线程去执行,而是在当前线程同步执行,只有将他放入队列里面,才会异步操作.

    [invocOp start];

    

    

    

    //2.NSBlockOpreation的使用:

    //初始化创建一个NSBlockOpreation对象,通过一个block来封装你要执行的任务.

     NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{

     NSLog(@"blockOpreation开始执行!");

     }];

    //在当前线程中执行,并不会异步执行,因为没有把他放入队列中.

    [blockOp start];

    //并发执行多个操作

    

    NSBlockOperation *allOp = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"执行1次操作的线程是:%@",[NSThread currentThread]);

    }];

    //添加新的操作任务

 

    [allOp addExecutionBlock:^{

        NSLog(@"二次执行1次操作的线程是:%@",[NSThread currentThread]);

 

    }];

    

    [allOp addExecutionBlock:^{

        NSLog(@"三次执行1次操作的线程是:%@",[NSThread currentThread]);

 

    }];

    [allOp start];

    /*

     并发执行就会开辟不同的线程

     我们通过打印就会发现,操作任务会在不同的线程执行.

     */

 

 

    //NSOpreation的其他相关使用,

/*

 1.取消操作调用[opreation cancel]

 

 2.执行完操作之后做一些事情

 opreation.completionBlock=^(){

  

 执行完毕会调用这个block

 

 }

 

 */

 

}

-(void)run:(NSString*)str

{

NSLog(@"%@开始运行",str);

    NSLog(@"当前线程是%@",[NSThread currentThread]);

 

}

 

 

 

 

 

posted @ 2015-04-16 10:50  huanglei201504  阅读(417)  评论(0编辑  收藏  举报