欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

队列 和 线程 之GCD dispatch

发布时间:2025/3/20 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 队列 和 线程 之GCD dispatch 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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 });

 

暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!

转载于:https://www.cnblogs.com/shen5214444887/p/4917343.html

总结

以上是生活随笔为你收集整理的队列 和 线程 之GCD dispatch的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。