NSOperation的几种使用方式

Posted on 2016-07-17 16:22  柠檬片  阅读(427)  评论(0)    收藏  举报

1.NSInvocationOperation

  创建NSInvocationOperation对象

    - (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

 

  调用start方法开始执行操作

    - (void)start;

    一旦执行操作,就会调用target的sel方法

 

  注意
    默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
    只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
 1 -(void)invocation
 2 {
 3     //    NSOperation *op = [[NSOperation alloc]init];
 4     
 5     /*
 6      第一个参数:目标对象
 7      第二个参数:选择器,要调用的方法
 8      第三个参数:方法要传递的参数
 9      */
10         NSInvocationOperation *op  = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];
11     //
12     //    //启动操作
13         [op start];
14     
15 }
16 -(void)download
17 {
18     NSLog(@"---%s---%@",__func__,[NSThread currentThread]);
19 }
示例

 

2.NSBlockOperation

  创建NSBlockOperation对象

    + (id)blockOperationWithBlock:(void (^)(void))block;

 

  通过addExecutionBlock:方法添加更多的操作

    - (void)addExecutionBlock:(void (^)(void))block;

 

  注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

 1 -(void)blockOperation
 2 {
 3     //1.封装操作
 4     NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
 5         //在主线程
 6         NSLog(@"1------%@",[NSThread currentThread]);
 7    
 8     }];
 9     
10     NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
11         NSLog(@"2------%@",[NSThread currentThread]);
12     }];
13     
14     //2.追加操作
15     //在子线程中执行
16     [op1 addExecutionBlock:^{
17         NSLog(@"3------%@",[NSThread currentThread]);
18     }];
19     [op1 addExecutionBlock:^{
20         NSLog(@"4------%@",[NSThread currentThread]);
21     }];
22     
23     [op1 addExecutionBlock:^{
24         NSLog(@"5------%@",[NSThread currentThread]);
25     }];
26     
27     
28     //3.启动操作执行
29     [op start];
30     [op1 start];
31 
32 }
示例

 

3.自定义子类继承NSOperation,实现内部相应的方法

  自定义的子类要实现-(void) Main方法

  如下:

  

#import "YSOperation.h"

@implementation YSOperation

//1.高封装,信息隐蔽
//2.复用性
-(void)main
{
    NSLog(@"---main---%@",[NSThread currentThread]);
    NSLog(@"1------%@",[NSThread currentThread]);
    }
@end

--------------------------------------------------------------------------------------------

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    YSOperation *op = [[YSOperation alloc]init];
    YSOperation *op1 = [[YSOperation alloc]init];
    [op start];
    [op1 start];
    
//    [[NSThread alloc]init]
    
}

示例
示例