iOS GCD的队列和线程
1、队列分为 串行队列 和 并行队列
2、线程分为 同步线程 和 异步线程
GCD运行需要队列,先创建队列
一、串行队列创建
//串行队列的创建 参数队列名 和 NULL dispatch_queue_t queueA = dispatch_queue_create("queueA", NULL); //系统提供一个全局串行队列 也就是主线程 // dispatch_get_main_queue()
二、并行队列创建
//GCD默认提供全局并发队列 //第一个参数表示优先级 0:默认,2:高,-1:低 dispatch_queue_t queueB = dispatch_get_global_queue(0, 0); //DISPATCH_QUEUE_PRIORITY_DEFAULT = 0
三、异步线程 + 并发队列 = 线程执行顺序是不固定的。项目中一般都是这种组合
//GCD异步线程 + 并发队列B dispatch_async(queueB, ^{ NSLog(@"网络请求1"); }); dispatch_async(queueB, ^{ NSLog(@"网络请求2"); }); dispatch_async(queueB, ^{ NSLog(@"网络请求3"); }); //打印结果 2021-04-24 21:42:42.175828+0800 BaseDemo[7676:275823] 网络请求1 2021-04-24 21:42:42.175830+0800 BaseDemo[7676:275827] 网络请求3 2021-04-24 21:42:42.175867+0800 BaseDemo[7676:275819] 网络请求2
如果要按顺序 可以加个信号量 信号量一般防止资源安全
// 创建信号量 信号量 = 1; 只走一个线程 dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); //等待 信号量 - 1;等待时间= DISPATCH_TIME_FOREVER = 永远 dispatch_semaphore_wait(semaphore, 1); //GCD异步线程 + 并发队列B dispatch_async(queueB, ^{ sleep(1); NSLog(@"网络请求1"); //信号量加一 程序继续向下 dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(queueB, ^{ sleep(1); NSLog(@"网络请求2"); dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(queueB, ^{ sleep(1); NSLog(@"网络请求3"); dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(queueB, ^{ sleep(1); NSLog(@"网络请求4"); dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(queueB, ^{ sleep(1); NSLog(@"网络请求5"); dispatch_semaphore_signal(semaphore); }); NSLog(@"我是外面线程"); //打印结果 2021-04-24 22:03:41.112360+0800 BaseDemo[7966:295504] 网络请求1 2021-04-24 22:03:42.114488+0800 BaseDemo[7966:295504] 网络请求2 2021-04-24 22:03:43.117322+0800 BaseDemo[7966:295504] 网络请求3 2021-04-24 22:03:44.118532+0800 BaseDemo[7966:295504] 网络请求4 2021-04-24 22:03:44.119006+0800 BaseDemo[7966:295015] 我是外面线程 2021-04-24 22:03:45.124105+0800 BaseDemo[7966:295504] 网络请求5
有空再加