在GCD中dispatch_suspend和dispatch_resume提供了“掛起、恢復(fù)”隊(duì)列的功能,簡(jiǎn)單來(lái)說(shuō),就是可以暫停、恢復(fù)隊(duì)列上的任務(wù)。但是這里的“掛起”,并不能保證可以立即停止隊(duì)列上正在運(yùn)行的block,未執(zhí)行的block會(huì)被“掛起”。
dispatch_suspend(queue) //暫停某個(gè)隊(duì)列 dispatch_suspend掛起指定的dispatch_queue
dispatch_resume(queue) //恢復(fù)某個(gè)隊(duì)列 dispatch_resume恢復(fù)指定的dispatch_queue
/*
dispatch_suspend會(huì)掛起dispatch queue,但并不意味著當(dāng)前正在執(zhí)行的任務(wù)會(huì)停下來(lái),這只會(huì)導(dǎo)致不再繼續(xù)執(zhí)行還未執(zhí)行的任務(wù)。
dispatch_resume會(huì)喚醒已掛起的dispatch queue。你必須確保它們成對(duì)調(diào)用。
*/
代碼執(zhí)行
dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
//提交第一個(gè)block,延時(shí)5秒打印。
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"五秒后打印,隊(duì)列掛起時(shí)已經(jīng)開(kāi)始執(zhí)行,");
});
//提交第二個(gè)block,也是延時(shí)5秒打印
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"隊(duì)列掛起時(shí)未執(zhí)行,需恢復(fù)隊(duì)列后在執(zhí)行");
});
//延時(shí)一秒
NSLog(@"立刻打印~~~~~~~");
[NSThread sleepForTimeInterval:1];
//掛起隊(duì)列
NSLog(@"一秒后打印,隊(duì)列掛起");
dispatch_suspend(queue);
//延時(shí)10秒
[NSThread sleepForTimeInterval:10];
NSLog(@"十秒后打印,開(kāi)啟隊(duì)列");
//恢復(fù)隊(duì)列
dispatch_resume(queue);
打印結(jié)果:
2017-05-04 16:22:57.279 Practice_Animation[2234:1740974] 立刻打印~~~~~~~
2017-05-04 16:22:58.281 Practice_Animation[2234:1740974] 一秒后打印,隊(duì)列掛起
2017-05-04 16:23:02.284 Practice_Animation[2234:1742180] 五秒后打印,隊(duì)列掛起時(shí)已經(jīng)開(kāi)始執(zhí)行,
2017-05-04 16:23:08.283 Practice_Animation[2234:1740974] 十秒后打印,開(kāi)啟隊(duì)列
2017-05-04 16:23:13.288 Practice_Animation[2234:1742717] 隊(duì)列掛起時(shí)未執(zhí)行,需恢復(fù)隊(duì)列后在執(zhí)行