1 @implementation HMViewController
2
3 - (void)viewDidLoad
4 {
5 [super viewDidLoad];
6
7 [self performSelectorInBackground:@selector(test) withObject:nil];
8
9 // [self syncMainQueue];
10 }
11
12 - (void)test
13 {
14 NSLog(@"test --- %@", [NSThread currentThread]);
15
16 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
17 NSLog(@"任务 --- %@", [NSThread currentThread]);
18 });
19 }
20
21 /**
22 * 使用dispatch_async异步函数, 在主线程中往主队列中添加任务
23 */
24 - (void)asyncMainQueue
25 {
26 // 1.获得主队列
27 dispatch_queue_t queue = dispatch_get_main_queue();
28
29 // 2.添加任务到队列中 执行
30 dispatch_async(queue, ^{
31 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
32 });
33 }
34
35 /**
36 * 使用dispatch_sync同步函数, 在主线程中往主队列中添加任务 : 任务无法往下执行
37 */
38 - (void)syncMainQueue
39 {
40 // 1.获得主队列
41 dispatch_queue_t queue = dispatch_get_main_queue();
42
43 // 2.添加任务到队列中 执行
44 dispatch_sync(queue, ^{
45 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
46 });
47 // dispatch_sync(queue, ^{
48 // NSLog(@"----下载图片2-----%@", [NSThread currentThread]);
49 // });
50 // dispatch_sync(queue, ^{
51 // NSLog(@"----下载图片3-----%@", [NSThread currentThread]);
52 // });
53
54 // 不会开启新的线程, 所有任务在主线程中执行
55 }
56
57 // 凡是函数名种带有create\copy\new\retain等字眼, 都需要在不需要使用这个数据的时候进行release
58 // GCD的数据类型在ARC环境下不需要再做release
59 // CF(Core Foundation)的数据类型在ARC环境下还是需要再做release
60
61 /**
62 * 用dispatch_sync同步函数往串行列中添加任务
63 */
64 - (void)syncSerialQueue
65 {
66 // 1.创建串行队列
67 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL);
68
69 // 2.添加任务到队列中 执行
70 dispatch_sync(queue, ^{
71 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
72 });
73 dispatch_sync(queue, ^{
74 NSLog(@"----下载图片2-----%@", [NSThread currentThread]);
75 });
76 dispatch_sync(queue, ^{
77 NSLog(@"----下载图片3-----%@", [NSThread currentThread]);
78 });
79
80 // 3.释放资源
81 // dispatch_release(queue); // MRC(非ARC)
82
83 // 总结: 不会开启新的线程
84 }
85
86 /**
87 * 用dispatch_sync同步函数往并发队列中添加任务
88 */
89 - (void)syncGlobalQueue
90 {
91 // 1.获得全局的并发队列
92 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
93
94 // 2.添加任务到队列中 执行
95 dispatch_sync(queue, ^{
96 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
97 });
98 dispatch_sync(queue, ^{
99 NSLog(@"----下载图片2-----%@", [NSThread currentThread]);
100 });
101 dispatch_sync(queue, ^{
102 NSLog(@"----下载图片3-----%@", [NSThread currentThread]);
103 });
104
105 // 总结: 不会开启新的线程, 并发队列失去了并发的功能
106 }
107
108 /**
109 * 用dispatch_async异步函数往串行队列中添加任务
110 */
111 - (void)asyncSerialQueue
112 {
113 // 1.创建串行队列
114 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL);
115
116 // 2.添加任务到队列中 执行
117 dispatch_async(queue, ^{
118 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
119 });
120 dispatch_async(queue, ^{
121 NSLog(@"----下载图片2-----%@", [NSThread currentThread]);
122 });
123 dispatch_async(queue, ^{
124 NSLog(@"----下载图片3-----%@", [NSThread currentThread]);
125 });
126
127 // 总结: 只开1个线程执行任务
128 }
129
130 /**
131 * 用dispatch_async异步函数往并发队列中添加任务
132 */
133 - (void)asyncGlobalQueue
134 {
135 // 1.获得全局的并发队列
136 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
137
138 // 2.添加任务到队列中 执行
139 dispatch_async(queue, ^{
140 NSLog(@"----下载图片1-----%@", [NSThread currentThread]);
141 });
142 dispatch_async(queue, ^{
143 NSLog(@"----下载图片2-----%@", [NSThread currentThread]);
144 });
145 dispatch_async(queue, ^{
146 NSLog(@"----下载图片3-----%@", [NSThread currentThread]);
147 });
148
149 // 总结: 同时开启了3个线程
150 }
151
152 @end