Вложенность DispatchSemaphore - PullRequest
       18

Вложенность DispatchSemaphore

1 голос
/ 23 апреля 2019

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

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

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, но это имеет эффектчто вложенный запрос никогда не выполняется - он бесконечно ждет сигнала семафора 2, который никогда не происходит.Как мне это исправить?

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()
...