今天,我已經試過下面的代碼:暫停串行隊列
- (void)suspendTest {
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_BACKGROUND, 0);
dispatch_queue_t suspendableQueue = dispatch_queue_create("test", attr);
for (int i = 0; i <= 10000; i++) {
dispatch_async(suspendableQueue, ^{
NSLog(@"%d", i);
});
if (i == 5000) {
dispatch_suspend(suspendableQueue);
}
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"Show must go on!");
dispatch_resume(suspendableQueue);
});
}
的代碼開始10001級的任務,但它應該暫停運行新任務隊列爲中途在6秒內恢復。此代碼按預期工作 - 執行5000個任務,然後隊列停止,並在6秒後恢復。 但是,如果我使用串行隊列,而不是併發隊列,行爲不明確。
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND, 0);
在這種情況下任務的隨機數理暫停之前執行,但往往這個數字接近於零(懸浮之前的任何任務發生)。 問題是 - 爲什麼暫停串行和併發隊列的工作以及如何正確暫停串行隊列?
您發佈的代碼不會編譯。你的'if(i == 5000){'行在for循環之後。 – rmaddy
我的錯,我只是通過記憶來重現它。讓我來修復它 –
好的,所以這是其中的一個問題,你不能將你的真實代碼粘貼到瀏覽器中?我無法理解這一點。 – matt