dispatch_suspend,dispatch_resume提供了“掛起蔚润、恢復(fù)”隊(duì)列的功能,簡(jiǎn)單來(lái)說(shuō)尺栖,就是可以暫停嫡纠、恢復(fù)隊(duì)列上的任務(wù)。但是這里的“掛起”延赌,并不能保證可以立即停止隊(duì)列上正在運(yùn)行的block
// 掛起指定隊(duì)列
dispatch_suspend(queue);
// 恢復(fù)指定隊(duì)列
dispatchp_resume(queue);
dispatch_queue_t queue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
//提交第一個(gè)block除盏,延時(shí)5秒打印。
dispatch_async(queue, ^{
sleep(5);
NSLog(@"After 5 seconds...");
});
//提交第二個(gè)block挫以,也是延時(shí)5秒打印
dispatch_async(queue, ^{
sleep(5);
NSLog(@"After 5 seconds again...");
});
//延時(shí)一秒
NSLog(@"sleep 1 second...");
sleep(1);
//掛起隊(duì)列
NSLog(@"suspend...");
dispatch_suspend(queue);
//延時(shí)10秒
NSLog(@"sleep 10 second...");
sleep(10);
//恢復(fù)隊(duì)列
NSLog(@"resume...");
dispatch_resume(queue);
打印結(jié)果:
2016-08-20 21:17:19.872 GCDDemo[8469:1016194] sleep 1 second...
2016-08-20 21:17:20.873 GCDDemo[8469:1016194] suspend...
2016-08-20 21:17:20.874 GCDDemo[8469:1016194] sleep 10 second...
2016-08-20 21:17:24.878 GCDDemo[8469:1016441] After 5 seconds...
2016-08-20 21:17:30.876 GCDDemo[8469:1016194] resume...
2016-08-20 21:17:35.881 GCDDemo[8469:1016441] After 5 seconds again...
在dispatch_suspend掛起隊(duì)列后痴颊,第一個(gè)block還是在運(yùn)行,并且正常輸出屡贺。
結(jié)論:
dispatch_suspend并不會(huì)立即暫停正在運(yùn)行的block蠢棱,而是在當(dāng)前block執(zhí)行完成后,暫停后續(xù)的block執(zhí)行甩栈。