Вложенный диспетчерский семафор

#swift #macos #synchronous #dispatchsemaphore

#swift #macos #синхронный #диспетчерский семафор

Вопрос:

У меня возникли проблемы с приведенным ниже шаблоном. Мне нужно синхронно дождаться начального асинхронного запроса, где блок завершения, в свою очередь, вызывает список асинхронных вызовов, где каждый из асинхронных вызовов должен дождаться завершения предыдущего, прежде чем он сможет начаться.

Приведенный ниже код вызовет все вложенные запросы одновременно, а это не то, что я хочу.

 let semaphore = DispatchSemaphore.init(value: 0)
self.getThings { (things) -> (Void) in
    for thing in things {
        self.getSomething { (somevalue) -> (Void) in
        }
    }
    semaphore.signal()
}
semaphore.wait()
  

Итак, что я попытался, это добавить еще один семафор внутри цикла for, но это приводит к тому, что вложенный запрос никогда не выполняется — он бесконечно ожидает сигнала semaphore2, который никогда не происходит. Как мне это исправить?

 let semaphore = DispatchSemaphore.init(value: 0)
self.getThings { (things) -> (Void) in
    for thing in things {
        let semaphore2 = DispatchSemaphore.init(value: 0)
        self.getSomething { (somevalue) -> (Void) in
            semaphore2.signal()
        }
        semaphore2.wait()
    }
    semaphore.signal()
}
semaphore.wait()
  

Комментарии:

1. Как насчет инкапсуляции объектов в NSOperation s, которые выполняются последовательно (путем установки NSOperationQueue максимального количества операций на 1 )?

2. @значение-имеет значение, если getSomething блок завершения экранируется, не NSOperation завершится до выполнения блока?