Для решения этой проблемы вы можете использовать GCD или Operation . В случае, если вы описали, я бы использовал Операция . Используя этот подход, вы можете иметь немного более удобный для пользователя контроль над Операцией , которая выполняется (остановка, отмена ....).
Маленький пример:
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.addOperation { print("?") }
queue.addOperation { print("?") }
queue.addOperation { print("?") }
В этом случае операции выполняются одна за другой.