OC 线程操作3 - NSOperation

 1 #import "ViewController.h"
 2 
 3 @interface ViewController ()
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
10     
11     [self BlockOperation];
12 
13 }
14 
15 -(void)BlockOperation{
16     //1.创建任务
17     NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
18         NSLog(@"op1----%@", [NSThread currentThread]);
19     }] ;
20     
21     NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
22         NSLog(@"op2----%@", [NSThread currentThread]);
23     }] ;
24 
25     NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
26         NSLog(@"op3----%@", [NSThread currentThread]);
27     }] ;
28     
29     //2.追加任务 注意:如果一个线程中的任务数量大于1,那么会开子线程并发执行任务,会开子线程但是不一定所有任务都在子线程运行,有可能某个任务是在主线程执行
30     [op3 addExecutionBlock:^{
31         NSLog(@"op4----%@", [NSThread currentThread]);
32     }];
33     
34     [op3 addExecutionBlock:^{
35         NSLog(@"op5 ----%@", [NSThread currentThread]);
36     }];
37     
38     
39     //3.操作监听, 可以放到任何位置,这个block也是并发执行的,不是一定在执行完op3 就会执行,他们不一定在同一个线程
40     op3.completionBlock = ^{
41         NSLog(@"op3.completionBlock=====");
42     };
43     
44     //4.启动操作
45 //    [op1 start];
46 //    [op2 start];
47 //    [op3 start];
48     
49     //5.依赖需要添加到队列之前,可以跨队列依赖,并且不能循环依赖,循环依赖不会执行循环的代码, 执行其他的
50     [op1 addDependency:op2];
51     [op2 addDependency:op3];
52     
53     
54     //6. 创建非主队列, 主队列是[NSOperationQueue mainQueue]
55     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
56     NSOperationQueue *queue2 = [[NSOperationQueue alloc] init];
57     
58     //7、添加任务
59     [queue addOperation:op3];//默认添加了 [op3 start]方法
60     [queue addOperation:op1];//默认添加了 [op1 start]方法
61     [queue2 addOperation:op2];//默认添加了 [op2 start]方法
62     
63     
64     //8.线程同时执行的数量 线程同时执行的数量,-1是最大值, 0是同步执行(打印结果线程不是一样的, 但是执行顺序 一定是1234,打印多少次都是1234),
65     queue.maxConcurrentOperationCount = 3;
66     
67     //9.简便添加方法 这个等于 步骤1 和步骤4 ,但是没办法添加依赖和监听,看具体使用环境 一般回到主队列刷新UI使用
68     [queue addOperationWithBlock:^{
69         NSLog(@"op110 ----%@", [NSThread currentThread]);
70     }];
71     
72     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
73         NSLog(@"回到主队列了-%@", [NSThread currentThread]);
74     }];
75 }
76 
77 -(void)InvocationOperation{
78     /**
79      参数1:使用对象
80      参数2:调用方法名称
81      参数3:前面方法需要参数
82      */
83     NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downLoad) object:nil];
84     
85     //开启线程
86     [op1 start];
87     //    op1.cancel;
88     
89 //    [self downLoad]; //这个和上边 两行一样。。。
90 }
91 
92 -(void)downLoad{
93     NSLog(@"%s----%@", __func__, [NSThread currentThread]);
94 }
95 @end

猜你喜欢

转载自www.cnblogs.com/qingzZ/p/9262376.html
今日推荐