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的主要内容,如果未能解决你的问题,请参考以下文章