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

多线程之 NSOperation

时间:2015-12-09 19:25:44      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

NSOperation

优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。

NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。

NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:一种是用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation,另一种是自定义子类继承NSOperation,实现内部相应的方法
  1. NSOperation的作用:配合使用NSOperation和NSOperationQueue也能实现多线程编程取消操作
  2. NSOperation和NSOperationQueue实现多线程的具体步骤:
          A.需要执行的操作封装到一个NSOperation对象中
          B.将NSOperation对象添加到NSOperationQueue中
         C.系统会?动将NSOperationQueue中的NSOperation取出来
         D.将取出的NSOperation封装的操作放到?条新线程中执?
 
 
 
 
    //1.NSInvocationOperation创建操作对象封装要执行的任务

    NSInvocationOperation *operation=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run1) object:nil];

    //执行操作  

    [operation start];

 

 //注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue,才会异步执行操作

    NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(run1) object:nil];

    [operation1 start];

  

    //2.NSBlockOperation

    NSBlockOperation *block=[NSBlockOperationblockOperationWithBlock:^{

        NSLog(@"block操作:%@",[NSThreadcurrentThread]);

    }];

    //NSBlockOperation对象中添加一个操作,如果NSBlockOperation对象至少包含了多个操作,有一个是主线程中执行,其他均在子线程中

    [block addExecutionBlock:^{

        NSLog(@"block操作1%@",[NSThreadcurrentThread ]);

    }];

    [block addExecutionBlock:^{

        NSLog(@"block操作2%@",[NSThreadcurrentThread ]);

    }];

    [block addExecutionBlock:^{

        NSLog(@"block操作3%@",[NSThreadcurrentThread ]);

    }];

    [block start];

    //注意:添加操作要放在start之前

 

 

    //创建队列:将操作放入队列中(主队列除外)默认的在子线程中执行,且不用手动start

    NSOperationQueue *queue=[[NSOperationQueuealloc]init]; //NSOperationQueue的作?:NSOperation可以调?start?法来执?任务,但默认是同步执行的。如果将NSOperation添加到NSOperationQueue(操作队列),系统会自动异步执行NSOperation中的操作。添加操作到NSOperationQueue中,自动执行操作,自动开启线程

    NSInvocationOperation *qoperation=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run2) object:nil  ];

    [queue addOperation:qoperation];

    [queue addOperationWithBlock:^{

         NSLog(@"block操作队列:%@",[NSThreadcurrentThread ]);

    }];

    

}

-(void)run1{

    NSLog(@"22222%@",[NSThreadcurrentThread]);

}

-(void)run2{

    NSLog(@"队列中执行:%@",[NSThreadcurrentThread]);

}

多线程之 NSOperation

标签:

原文地址:http://www.cnblogs.com/wyhwyh2114/p/5033691.html

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