首页 > 其他 > 详细

NSOperation与GCD之间的关系

时间:2015-10-31 11:20:16      阅读:294      评论:0      收藏:0      [点我收藏+]

NSOperation与GCD的相同之处

1.NSOperation和NSOperationQueue实现多线程的步骤:

先将需要执行的操作封装到一个NSOperation对象中。

然后将NSOperation对象添加到NSOperationQueue中。

系统会自动将NSOperationQueue中的NSOperation取出来。

将取出的NSOperation封装的操作放到一条新线程中执行。

2.NSOperation是一个抽象,并不具封装操作的能力,必使用它的子

使用NSOperation的方式有三种:

NSInvocationOperation

NSBlockOperation

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

NSOperation其实就是对GCD的一个封装。

NSInvocationOperation

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

调用start方法开始执行操作

-(void)start;

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

注意:默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。

只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

NSBlockOperation

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

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

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

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

 1 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 2 {
 3 //    [self opDemo1];
 4 //    [self opDemo2];
 5 //    [self opDemo3];
 6     [self opDemo4];
 7 }
 8 
 9 - (void)down
10 {
11     for (int i = 0; i < 2; i ++) {
12           NSLog(@"%d", i+2);
13     }
14 }
15 
16 #pragma mark - 单个NSInvocationOperation使用
17 - (void) opDemo1
18 {
19     NSLog(@"1");
20     //创建操作
21     NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
22     //直接在当前线程执行(同步执行)【没有开辟线程】
23     [op start];
24     //放到队列gg
25 //    NSOperationQueue * que = [[NSOperationQueue alloc] init];
26 //    //只要把操作添加到队列,就会异步执行任务(但是任务中的任务会顺序执行)【开辟了线程】
27 //    [que addOperation:op];
28     NSLog(@"3");
29 }
30 
31 - (void) opDemo2
32 {
33     NSLog(@"1");
34     /**
35      1.队列(GCD里面的并发(全局)队列使用最多),所以NSOperation技术直接把GCD里面的并发技术封装起来
36      2.NSOperationQueue,本质就是GCD里面的并发队列
37      3.操作是GCD里面的异步执行的任务
38      **/
39     NSOperationQueue * q = [[NSOperationQueue alloc] init];
40     for (int i = 0; i < 2; i ++) {
41         NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
42         [q addOperation:op];
43     }
44     NSLog(@"4");
45 }
46 
47 - (void) opDemo3
48 {
49     NSLog(@"1");
50     //相当于GCD主队列
51     NSOperationQueue * q = [NSOperationQueue mainQueue];
52     //当NSOpertaion获取主线程,不会在开辟线程,但是里面的任务会在其他主线程任务执行完成后才回归执行
53     for (int i = 0; i < 5; i ++) {
54         
55         NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
56            NSLog(@"%@==========%d", [NSThread currentThread], i);
57         }];
58         //将block放入到队列
59         //block中可以添加多个任务
60         [q addOperation:op];
61     }
62     NSLog(@"6");
63     
64 }
65 
技术分享
66 - (void) opDemo4
67 {
68     NSLog(@"1");
69     NSOperationQueue * q = [[NSOperationQueue alloc] init];
70     //block块中可以写多个任务(里面串行队列),相当于GCD中的并行串行队列
71     NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
72         NSLog(@"2");
73         NSLog(@"3");
74         NSLog(@"4");
75     }];
76     [q addOperation:op];
77     //还可以在外面给队列添加任务.但是遵循fifo
78     [op addExecutionBlock:^{
79         NSLog(@"6");
80         NSLog(@"7");
81     }];
82     NSLog(@"5");
83 }

 

NSOperation与GCD之间的关系

原文:http://www.cnblogs.com/YU411524/p/4925049.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!