ios多线程之GCD

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios多线程之GCD相关的知识,希望对你有一定的参考价值。

  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

 

以上是关于ios多线程之GCD的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C IOS多线程之GCD深入理解

iOS多线程之GCD小记

iOS底层探索之多线程—GCD源码分析(栅栏函数)

iOS底层探索之多线程—GCD的队列

IOS中的多线程之GCD

ios多线程之GCD