Если вы хотите предотвратить одновременную работу двух блоков одного типа, вы можете использовать диспетчерский семафор.Если для семафора установлено значение 1, вы можете проверить семафор перед тем, как выстрелить из блока, и поручиться, если что-то еще работает.В конце блока вы даете сигнал семафору разрешить отправку других блоков.
Я делаю это в одном из моих приложений, чтобы предотвратить добавление более одного блока рендеринга кадров OpenGL ES в очередь водин раз (предотвращение накопления блоков в очереди, если на рендеринг кадра требуется больше 1/60 секунды).Я описываю это в своем ответе здесь , используя следующий код:
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);
Есливы создаете подобный семафор для операций загрузки каждой вкладки, вы можете проверить, чтобы убедиться, что более одной загрузки не ставится в очередь одновременно для этой вкладки.