iOS GCD的使用

<一> 同步串行
// 创建一个串行队列:
dispatch_queue_t queue = dispatch_queue_create(“serial”, DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{// 同步执行
NSLog(@”%@”,[NSThread currentThread]);
NSLog(@”……”);
});
NSLog(@”执行”);
NSLog(@”%@”,[NSThread currentThread]);
执行结果:所有任务在主线程中顺序执行,没有开辟子线程。
2016-03-15 14:55:37.366 MyDemo[28100:762177] {number = 1, name = main}
2016-03-15 14:55:37.366 MyDemo[28100:762177] ……
2016-03-15 14:55:37.366 MyDemo[28100:762177] 执行
2016-03-15 14:55:37.366 MyDemo[28100:762177] {number = 1, name = main}

<二> 异步串行
dispatch_queue_t queue = dispatch_queue_create(“队列名称自定义”,DISPATCH_QUEUE_SERIAL)
dispatch_async(queue, ^{
for (int i = 0,i < 5 i++){
NSLog(@”++++++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”子线程%@”,[NSThread currentThread]);
});
for (int i = 0,i < 5 i++){
NSLog(@”—————”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”主线程–>%@”,[NSThread currentThread]);
第一次执行结果: 在主线程之外,开辟子线程执行任务;主线程,子线程独立运行 互不干扰;至于执行先后,看谁先分配到CPU资源
2016-03-15 16:15:08.468 MyDemo[28462:822263] ————-
2016-03-15 16:15:08.468 MyDemo[28462:822297] ++++++++++
2016-03-15 16:15:09.470 MyDemo[28462:822263] ————-
2016-03-15 16:15:09.470 MyDemo[28462:822297] ++++++++++
2016-03-15 16:15:10.475 MyDemo[28462:822263] ————-
2016-03-15 16:15:10.475 MyDemo[28462:822297] ++++++++++
2016-03-15 16:15:11.476 MyDemo[28462:822263] ————-
2016-03-15 16:15:11.476 MyDemo[28462:822297] ++++++++++
2016-03-15 16:15:12.481 MyDemo[28462:822263] ————-
2016-03-15 16:15:12.481 MyDemo[28462:822297] ++++++++++
2016-03-15 16:15:13.484 MyDemo[28462:822297] {number = 2, name = (null)}
2016-03-15 16:15:13.484 MyDemo[28462:822263] {number = 1, name = main}
第二次执行结果:
2016-03-15 16:17:20.811 MyDemo[28550:824910] ++++++++++
2016-03-15 16:17:20.811 MyDemo[28550:824891] ————-
2016-03-15 16:17:21.814 MyDemo[28550:824910] ++++++++++
2016-03-15 16:17:21.814 MyDemo[28550:824891] ————-
2016-03-15 16:17:22.816 MyDemo[28550:824910] ++++++++++
2016-03-15 16:17:22.816 MyDemo[28550:824891] ————-
2016-03-15 16:17:23.817 MyDemo[28550:824910] ++++++++++
2016-03-15 16:17:23.817 MyDemo[28550:824891] ————-
2016-03-15 16:17:24.822 MyDemo[28550:824891] ————-
2016-03-15 16:17:24.822 MyDemo[28550:824910] ++++++++++
2016-03-15 16:17:25.825 MyDemo[28550:824910] {number = 2, name = (null)}
2016-03-15 16:17:25.825 MyDemo[28550:824891] {number = 1, name = main}

<三>同步并行
dispatch_queue_t queue = dispatch_queue_create(“concurrentQueue”, DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for (int i =0; i < 5; i++) {
NSLog(@”++++++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
dispatch_sync(queue, ^{
for (int i =0; i < 5; i++) {
NSLog(@”——————”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
for (int i = 0; i < 5; i++) {
NSLog(@”===========”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
执行结果: 没有开辟子线程,所有任务均在主线程顺序执行( 这里的并行没有任何意义 )
2016-03-15 15:16:04.611 MyDemo[28192:775028] ++++++++++
2016-03-15 15:16:05.617 MyDemo[28192:775028] ++++++++++
2016-03-15 15:16:06.621 MyDemo[28192:775028] ++++++++++
2016-03-15 15:16:07.623 MyDemo[28192:775028] ++++++++++
2016-03-15 15:16:08.626 MyDemo[28192:775028] ++++++++++
2016-03-15 15:16:09.632 MyDemo[28192:775028] {number = 1, name = main}
2016-03-15 15:16:09.632 MyDemo[28192:775028] ——————
2016-03-15 15:16:10.635 MyDemo[28192:775028] ——————
2016-03-15 15:16:11.638 MyDemo[28192:775028] ——————
2016-03-15 15:16:12.643 MyDemo[28192:775028] ——————
2016-03-15 15:16:13.649 MyDemo[28192:775028] ——————
2016-03-15 15:16:14.652 MyDemo[28192:775028] {number = 1, name = main}
2016-03-15 15:16:14.653 MyDemo[28192:775028] ===========
2016-03-15 15:16:15.657 MyDemo[28192:775028] ===========
2016-03-15 15:16:16.661 MyDemo[28192:775028] ===========
2016-03-15 15:16:17.663 MyDemo[28192:775028] ===========
2016-03-15 15:16:18.668 MyDemo[28192:775028] ===========
2016-03-15 15:16:19.673 MyDemo[28192:775028] {number = 1, name = main}

<四>异步并行
dispatch_queue_t queue = dispatch_queue_create(“concurrentQueue”, DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0 ; i < 5; i++) {
NSLog(@”+++++++++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
dispatch_async(queue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@”———————-“);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
for (int i = 0; i < 5; i++) {
NSLog(@”=============”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
第一次执行结果:在主线程之外,额外开辟子线程执行队列中的任务,主线程,子线程独立运行 互不干扰;至于执行先后,看谁先分配到CPU资源
2016-03-15 16:21:36.268 MyDemo[28575:827152] ———————-
2016-03-15 16:21:36.268 MyDemo[28575:827153] +++++++++++++
2016-03-15 16:21:36.268 MyDemo[28575:827110] =============
2016-03-15 16:21:37.272 MyDemo[28575:827152] ———————-
2016-03-15 16:21:37.272 MyDemo[28575:827153] +++++++++++++
2016-03-15 16:21:37.273 MyDemo[28575:827110] =============
2016-03-15 16:21:38.276 MyDemo[28575:827153] +++++++++++++
2016-03-15 16:21:38.276 MyDemo[28575:827152] ———————-
2016-03-15 16:21:38.276 MyDemo[28575:827110] =============
2016-03-15 16:21:39.281 MyDemo[28575:827153] +++++++++++++
2016-03-15 16:21:39.281 MyDemo[28575:827152] ———————-
2016-03-15 16:21:39.281 MyDemo[28575:827110] =============
2016-03-15 16:21:40.285 MyDemo[28575:827153] +++++++++++++
2016-03-15 16:21:40.285 MyDemo[28575:827152] ———————-
2016-03-15 16:21:40.285 MyDemo[28575:827110] =============
2016-03-15 16:21:41.287 MyDemo[28575:827110] {number = 1, name = main}
2016-03-15 16:21:41.287 MyDemo[28575:827153] {number = 3, name = (null)}
2016-03-15 16:21:41.287 MyDemo[28575:827152] {number = 2, name = (null)}
第二次执行结果:
2016-03-15 16:22:32.403 MyDemo[28593:828210] =============
2016-03-15 16:22:32.403 MyDemo[28593:828247] +++++++++++++
2016-03-15 16:22:32.403 MyDemo[28593:828248] ———————-
2016-03-15 16:22:33.405 MyDemo[28593:828210] =============
2016-03-15 16:22:33.405 MyDemo[28593:828247] +++++++++++++
2016-03-15 16:22:33.405 MyDemo[28593:828248] ———————-
2016-03-15 16:22:34.406 MyDemo[28593:828210] =============
2016-03-15 16:22:34.406 MyDemo[28593:828247] +++++++++++++
2016-03-15 16:22:34.406 MyDemo[28593:828248] ———————-
2016-03-15 16:22:35.409 MyDemo[28593:828247] +++++++++++++
2016-03-15 16:22:35.409 MyDemo[28593:828248] ———————-
2016-03-15 16:22:35.409 MyDemo[28593:828210] =============
2016-03-15 16:22:36.414 MyDemo[28593:828247] +++++++++++++
2016-03-15 16:22:36.414 MyDemo[28593:828248] ———————-
2016-03-15 16:22:36.414 MyDemo[28593:828210] =============
2016-03-15 16:22:37.419 MyDemo[28593:828247] {number = 2, name = (null)}
2016-03-15 16:22:37.419 MyDemo[28593:828248] {number = 3, name = (null)}
2016-03-15 16:22:37.419 MyDemo[28593:828210] {number = 1, name = main}
第三次执行结果:
2016-03-15 16:23:13.122 MyDemo[28613:829298] +++++++++++++
2016-03-15 16:23:13.122 MyDemo[28613:829238] =============
2016-03-15 16:23:13.122 MyDemo[28613:829299] ———————-
2016-03-15 16:23:14.124 MyDemo[28613:829298] +++++++++++++
2016-03-15 16:23:14.124 MyDemo[28613:829299] ———————-
2016-03-15 16:23:14.124 MyDemo[28613:829238] =============
2016-03-15 16:23:15.128 MyDemo[28613:829298] +++++++++++++
2016-03-15 16:23:15.128 MyDemo[28613:829238] =============
2016-03-15 16:23:15.128 MyDemo[28613:829299] ———————-
2016-03-15 16:23:16.133 MyDemo[28613:829238] =============
2016-03-15 16:23:16.133 MyDemo[28613:829299] ———————-
2016-03-15 16:23:16.133 MyDemo[28613:829298] +++++++++++++
2016-03-15 16:23:17.138 MyDemo[28613:829298] +++++++++++++
2016-03-15 16:23:17.138 MyDemo[28613:829238] =============
2016-03-15 16:23:17.138 MyDemo[28613:829299] ———————-
2016-03-15 16:23:18.142 MyDemo[28613:829298] {number = 2, name = (null)}
2016-03-15 16:23:18.143 MyDemo[28613:829238] {number = 1, name = main}
2016-03-15 16:23:18.143 MyDemo[28613:829299] {number = 3, name = (null)}

<五> 主队列 属于串行队列
//主队列同步
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@”+++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
for (int i = 0; i < 5; i++) {
NSLog(@”————-“);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
执行结果:出现主线程阻塞
在主队列开启同步任务,因为主队列是串行队列,里面的线程是有顺序的,先执行完一个线程才执行下一个线程,而主队列始终就只有一个主线程,主线程是不会执行完毕的,因为他是无限循环的,除非关闭应用程序。因此在主线程开启一个同步任务,同步任务会想抢占执行的资源,而主线程任务一直在执行某些操作,不肯放手。两个的优先级都很高,最终导致死锁,阻塞线程了。
// 主队列 异步
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@”+++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
for (int i = 0; i < 5; i++) {
NSLog(@”————-“);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
执行结果:没有开辟子线程,所有任务在主线程中顺序执行。 主队列开启异步任务,虽然不会开启新的线程,但是他会把异步任务降低优先级,等闲着的时候,就会在主线程上执行异步任务。
2016-03-15 16:59:13.437 MyDemo[28751:852957] ————-
2016-03-15 16:59:14.441 MyDemo[28751:852957] ————-
2016-03-15 16:59:15.447 MyDemo[28751:852957] ————-
2016-03-15 16:59:16.450 MyDemo[28751:852957] ————-
2016-03-15 16:59:17.453 MyDemo[28751:852957] ————-
2016-03-15 16:59:18.456 MyDemo[28751:852957] {number = 1, name = main}
2016-03-15 16:59:18.473 MyDemo[28751:852957] +++++++
2016-03-15 16:59:19.477 MyDemo[28751:852957] +++++++
2016-03-15 16:59:20.483 MyDemo[28751:852957] +++++++
2016-03-15 16:59:21.486 MyDemo[28751:852957] +++++++
2016-03-15 16:59:22.491 MyDemo[28751:852957] +++++++
2016-03-15 16:59:23.493 MyDemo[28751:852957] {number = 1, name = main}

<六> 全局队列 属于并行队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@”+++++++++”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
dispatch_async(globalQueue, ^{
for (int i =0; i < 5; i++) {
NSLog(@”————–”);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
});
for (int i = 0; i < 5; i++) {
NSLog(@”————-“);
[NSThread sleepForTimeInterval:1.0];
}
NSLog(@”%@”,[NSThread currentThread]);
第一次执行结果:异步开辟子线程,执行队列中的任务。
2016-03-15 17:14:12.086 MyDemo[28879:864092] +++++++++
2016-03-15 17:14:12.086 MyDemo[28879:864046] ==========
2016-03-15 17:14:12.086 MyDemo[28879:864091] ————–
2016-03-15 17:14:13.090 MyDemo[28879:864092] +++++++++
2016-03-15 17:14:13.090 MyDemo[28879:864046] ==========
2016-03-15 17:14:13.090 MyDemo[28879:864091] ————–
2016-03-15 17:14:14.095 MyDemo[28879:864092] +++++++++
2016-03-15 17:14:14.095 MyDemo[28879:864091] ————–
2016-03-15 17:14:14.095 MyDemo[28879:864046] ==========
2016-03-15 17:14:15.099 MyDemo[28879:864092] +++++++++
2016-03-15 17:14:15.099 MyDemo[28879:864091] ————–
2016-03-15 17:14:15.099 MyDemo[28879:864046] ==========
2016-03-15 17:14:16.103 MyDemo[28879:864092] +++++++++
2016-03-15 17:14:16.103 MyDemo[28879:864046] ==========
2016-03-15 17:14:16.103 MyDemo[28879:864091] ————–
2016-03-15 17:14:17.109 MyDemo[28879:864092] {number = 2, name = (null)}
2016-03-15 17:14:17.109 MyDemo[28879:864046] {number = 1, name = main}
2016-03-15 17:14:17.109 MyDemo[28879:864091] {number = 3, name = (null)}
第二次执行结果:
2016-03-15 17:14:47.444 MyDemo[28898:865088] ==========
2016-03-15 17:14:47.444 MyDemo[28898:865133] ————–
2016-03-15 17:14:47.444 MyDemo[28898:865134] +++++++++
2016-03-15 17:14:48.449 MyDemo[28898:865088] ==========
2016-03-15 17:14:48.449 MyDemo[28898:865134] +++++++++
2016-03-15 17:14:48.449 MyDemo[28898:865133] ————–
2016-03-15 17:14:49.450 MyDemo[28898:865134] +++++++++
2016-03-15 17:14:49.450 MyDemo[28898:865088] ==========
2016-03-15 17:14:49.454 MyDemo[28898:865133] ————–
2016-03-15 17:14:50.454 MyDemo[28898:865088] ==========
2016-03-15 17:14:50.454 MyDemo[28898:865134] +++++++++
2016-03-15 17:14:50.455 MyDemo[28898:865133] ————–
2016-03-15 17:14:51.454 MyDemo[28898:865134] +++++++++
2016-03-15 17:14:51.454 MyDemo[28898:865088] ==========
2016-03-15 17:14:51.456 MyDemo[28898:865133] ————–
2016-03-15 17:14:52.456 MyDemo[28898:865134] {number = 2, name = (null)}
2016-03-15 17:14:52.456 MyDemo[28898:865088] {number = 1, name = main}
2016-03-15 17:14:52.461 MyDemo[28898:865133] {number = 3, name = (null)}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值