IOS GCD(线程的 串行并发 基本使用)
Posted 守望星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS GCD(线程的 串行并发 基本使用)相关的知识,希望对你有一定的参考价值。
// 凡是函数名种带有create\copy\new\retain等字眼, 都需要在不需要使用这个数据的时候进行release
// GCD的数据类型在ARC环境下不需要再做release
// CF(Core Foundation)的数据类型在ARC环境下还是需要再做release
@implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; [self performSelectorInBackground:@selector(test) withObject:nil]; // [self syncMainQueue]; } - (void)test { NSLog(@"test --- %@", [NSThread currentThread]); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"任务 --- %@", [NSThread currentThread]); }); } /** * 使用dispatch_async异步函数, 在主线程中往主队列中添加任务 */ - (void)asyncMainQueue { // 1.获得主队列 dispatch_queue_t queue = dispatch_get_main_queue(); // 2.添加任务到队列中 执行 dispatch_async(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); } /** * 使用dispatch_sync同步函数, 在主线程中往主队列中添加任务 : 任务无法往下执行 */ - (void)syncMainQueue { // 1.获得主队列 dispatch_queue_t queue = dispatch_get_main_queue(); // 2.添加任务到队列中 执行 dispatch_sync(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); // dispatch_sync(queue, ^{ // NSLog(@"----下载图片2-----%@", [NSThread currentThread]); // }); // dispatch_sync(queue, ^{ // NSLog(@"----下载图片3-----%@", [NSThread currentThread]); // }); // 不会开启新的线程, 所有任务在主线程中执行 } // 凡是函数名种带有create\copy\new\retain等字眼, 都需要在不需要使用这个数据的时候进行release // GCD的数据类型在ARC环境下不需要再做release // CF(Core Foundation)的数据类型在ARC环境下还是需要再做release /** * 用dispatch_sync同步函数往串行列中添加任务 */ - (void)syncSerialQueue { // 1.创建串行队列 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL); // 2.添加任务到队列中 执行 dispatch_sync(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"----下载图片2-----%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"----下载图片3-----%@", [NSThread currentThread]); }); // 3.释放资源 // dispatch_release(queue); // MRC(非ARC) // 总结: 不会开启新的线程 } /** * 用dispatch_sync同步函数往并发队列中添加任务 */ - (void)syncGlobalQueue { // 1.获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2.添加任务到队列中 执行 dispatch_sync(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"----下载图片2-----%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"----下载图片3-----%@", [NSThread currentThread]); }); // 总结: 不会开启新的线程, 并发队列失去了并发的功能 } /** * 用dispatch_async异步函数往串行队列中添加任务 */ - (void)asyncSerialQueue { // 1.创建串行队列 dispatch_queue_t queue = dispatch_queue_create("com.itheima.queue", NULL); // 2.添加任务到队列中 执行 dispatch_async(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----下载图片2-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----下载图片3-----%@", [NSThread currentThread]); }); // 总结: 只开1个线程执行任务 } /** * 用dispatch_async异步函数往并发队列中添加任务 */ - (void)asyncGlobalQueue { // 1.获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2.添加任务到队列中 执行 dispatch_async(queue, ^{ NSLog(@"----下载图片1-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----下载图片2-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----下载图片3-----%@", [NSThread currentThread]); }); // 总结: 同时开启了3个线程 } @end
以上是关于IOS GCD(线程的 串行并发 基本使用)的主要内容,如果未能解决你的问题,请参考以下文章