Детская площадка - отношения между DispatchQueue и DispatchSemaphore

Я запутался с DispatchQueue и DispatchSemaphore.Как следующий пример:

let semaphore : DispatchSemaphore = DispatchSemaphore(value:1)
for i in 1...40 {
    DispatchQueue.global().async{
        semaphore.wait()
        NSLog("......1-%d",i)
        semaphore.signal()
    }
}

Я думаю, что это должно вывести 1...40, на самом деле это только около 25, результат примерно такой:

2016-11-18 19:05:38.786 MyPlayground[7436:495171] ......1-1
2016-11-18 19:05:38.787 MyPlayground[7436:495175] ......1-2
......
2016-11-18 19:05:38.797 MyPlayground[7436:495258] ......1-23
2016-11-18 19:05:38.797 MyPlayground[7436:495244] ......1-24

В чем причина?

1 ответ

Решение

Поскольку вы запускаете его асинхронно, Playground заканчивается до того, как все 40 итераций завершены. Добавьте эти 2 строки в начало или конец вашего кода:

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
Другие вопросы по тегам