如果您想防止同時運行兩個相同類型的塊,則可以使用調度信號量。信號量設置爲1時,您可以在發射塊之前檢查信號量,並在有些事情仍在運行時保釋。在該塊的結尾處,您發出信號燈以允許提交其他塊。
我在我的一個應用程序中這樣做,以防止一次將多個OpenGL ES幀渲染塊添加到隊列中(如果幀長度超過1/60秒,防止在隊列中累積塊渲染)。我介紹一些這在我的答案here,使用下面的代碼:
if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
return;
}
dispatch_async(openGLESContextQueue, ^{
[EAGLContext setCurrentContext:context];
// Render here
dispatch_semaphore_signal(frameRenderingSemaphore);
});
其中前面創建frameRenderingSemaphore
如下:
frameRenderingSemaphore = dispatch_semaphore_create(1);
如果您創建的每個選項卡的下載操作了類似的信號,你可以進行檢查以確保多個下載不會在該選項卡上一次排隊。
「GCD將啓動另一個線程」。其實我認爲你告訴GCD開始另一個線程。你需要某種標誌來表明線程正在運行。在塊的開始位置設置爲true,在末尾設置爲false。我相信對bool的讀/寫是一種內在的。 –