您的位置:首页 > 移动开发 > IOS开发

iOS GCD的使用

2016-03-15 15:19 288 查看
<一> 同步串行

// 创建一个串行队列:

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)}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: