iOS NSOperation之详解1(NSInvocationOperation,NSBlockOperation,设置依赖)

来源:互联网 发布:怎么查询数据库的用户 编辑:程序博客网 时间:2024/04/30 00:17

1.NSOperation本身是抽象基类,因此必须使用它的子类。

2.Foundation框架提供了两个具体子类供我们使用:NSInvocationOperation和NSBlockOperation

3.我们也可以自定义子类继承NSOperation,重写mian()方法即可。

下面我们通过实际代码一个一个来理解:

1.使用系统提供的两个子类:NSInvocationOperation和NSBlockOperation

</pre></p><p class="p1"><pre name="code" class="objc">-(void)test1{    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fun1) object:nil];        NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fun2) object:nil];        NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{                NSLog(@"NSBlockOperation3-->%@",[NSThread currentThread]);    }];    [operation3 addExecutionBlock:^{                NSLog(@"NSBlockOperation33-->%@",[NSThread currentThread]);    }];        //直接使用start,会走在主线程    //[operation1 start];        //放在队列里,会开启异步线程    NSOperationQueue *queue=[[NSOperationQueue alloc]init];    [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];}-(void)fun1{    NSLog(@"NSInvocation1-->%@",[NSThread currentThread]);}-(void)fun2{    NSLog(@"NSInvocation2-->%@",[NSThread currentThread]);}


结果如下:说明分别开启线程并发执行了。

2016-03-11 09:30:46.210 iOS学习_NSOperation2[2562:143581] NSInvocation1--><NSThread: 0x7f9521e0d9b0>{number = 3, name = (null)}2016-03-11 09:30:46.210 iOS学习_NSOperation2[2562:143582] NSInvocation2--><NSThread: 0x7f9521d23960>{number = 2, name = (null)}2016-03-11 09:30:46.211 iOS学习_NSOperation2[2562:143588] NSBlockOperation33--><NSThread: 0x7f9521d23c80>{number = 4, name = (null)}2016-03-11 09:30:46.211 iOS学习_NSOperation2[2562:143583] NSBlockOperation3--><NSThread: 0x7f9521e0aa60>{number = 5, name = (null)}


2.使用自定义子类

新建一个JYOperation子类继承NSOperation

重写main()方法即可

#import "JYOperation.h"@implementation JYOperation-(void)main{    NSLog(@"自定义的NSOperation实现");}@end

然后在需要使用的控制器中导入该头文件即可

//使用自定义的NSOperation子类-(void)test2{    JYOperation *operation=[[JYOperation alloc]init];        //创建队列    NSOperationQueue *queue=[[NSOperationQueue alloc]init];    [queue addOperation:operation];}


3.NSOperation有一个特性是创建operation之间的依赖。可以方便的设置执行特性顺序的任务集。

-(void)test3{    NSBlockOperation *operationA=[NSBlockOperation blockOperationWithBlock:^{                NSLog(@"任务A开始");        sleep(3);        NSLog(@"任务A结束");    }];        NSBlockOperation *operationB=[NSBlockOperation blockOperationWithBlock:^{                NSLog(@"任务B开始");        sleep(3);        NSLog(@"任务B结束");    }];        NSBlockOperation *operationC=[NSBlockOperation blockOperationWithBlock:^{                NSLog(@"任务C开始");        sleep(3);        NSLog(@"任务C结束");    }];        //设置A依赖B,B依赖C    [operationA addDependency:operationB];    [operationB addDependency:operationC];        NSOperationQueue *queue=[[NSOperationQueue alloc]init];    [queue addOperations:@[operationA,operationB,operationC] waitUntilFinished:NO];}


1 0
原创粉丝点击