1.dispatch_queue_create 创建队列开启异步线程(1,4,2,3)
// 创建一个队列 dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1111"); // 开启一个异步线程 dispatch_async(queue, ^{ NSLog(@"2222"); // 线程等待10秒 [NSThread sleepForTimeInterval:5]; NSLog(@"3333"); }); NSLog(@"4444");
2.创建队列开启同步线程(1,2,3,4)
// 创建一个队列 dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1111"); // 开启一个同步线程 dispatch_sync(queue, ^{ NSLog(@"2222"); // 线程等待10秒 [NSThread sleepForTimeInterval:5]; NSLog(@"3333"); }); NSLog(@"4444");
3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)
NSLog(@"1111"); // 获取全局队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 开启一个异步线程 dispatch_async(queue, ^{ NSLog(@"2222222"); [NSThread sleepForTimeInterval:5]; NSLog(@"333"); }); NSLog(@"4444");
4.获取全局队列开启同步线程 (1,2,3,4)
NSLog(@"1111"); // 获取全局队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 开启一个同步线程 dispatch_sync(queue, ^{ NSLog(@"2222222"); [NSThread sleepForTimeInterval:5]; NSLog(@"333"); }); NSLog(@"4444");
5.dispatch_get_main_queue() 获取主线程队列,再开启异步线程(1,4,2,3)
NSLog(@"1111"); // 获取主线程队列 dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_async(queue, ^{ NSLog(@"2222"); [NSThread sleepForTimeInterval:5]; NSLog(@"33333"); }); NSLog(@"4444");
6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死
NSLog(@"1111"); // 获取主线程队列 dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_sync(queue, ^{ NSLog(@"2222"); [NSThread sleepForTimeInterval:5]; NSLog(@"33333"); }); NSLog(@"4444");
总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大
7.dispatch_get_main_queue() 回到主线程
耗时操作需需要放在异步线程里,UI界面更新必须放在主界面里
[2376:131819] 1111
[2376:131819] 4444
[2376:131860] 2222
[2376:131860] 3333
[2376:131819] 5555
从打印结果来看(1,4,5是在主线程里面,2,3是在异步线程里面)
NSLog(@"1111"); // 获取主线程队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSLog(@"2222"); [NSThread sleepForTimeInterval:5]; // 回到主线程 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"5555"); }); NSLog(@"3333"); }); NSLog(@"4444");
8.dispatch_apply 执行某个片段N(6)次
dispatch_apply(6, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) { NSLog(@"1111"); });
9.dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行 (2,1,3,4)
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:3]; NSLog(@"111"); }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"222"); }); dispatch_barrier_async(queue, ^{ NSLog(@"333_barrier"); [NSThread sleepForTimeInterval:4]; }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"444"); });
10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 创建一组任务 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"111"); }); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"222"); }); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; NSLog(@"333"); }); // 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"444"); });
11.dispatch_once 对于某个任务执行一次,且只执行一次。
dispatch_once
函数有两个参数,第一个参数predicate
用来保证执行一次,第二个参数是要执行一次的任务block。
static dispatch_once_t predicate; dispatch_once(&predicate, ^{ // some one-time task });
暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了