func query(address: String) -> String {
let url = URL(string: address)
let semaphore = DispatchSemaphore(value: 0)
var result: String = ""
let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in
result = String(data: data!, encoding: String.Encoding.utf8)!
semaphore.signal()
}
task.resume()
semaphore.wait()
return result
}
Поток 1 (основной):
let url = URL(string: address)
let semaphore = DispatchSemaphore(value: 0)
var result: String = ""
let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in
/* эти строки сейчас не выполняются */ result = String(data: data!, encoding: String.Encoding.utf8)!
/* эти строки сейчас не выполняются */ semaphore.signal()
}
Все еще Поток 1 (основной):
task.resume()-------
| \
| \
| \
| \
| \
| \
Поток 1 (основной): Поток 2:
semaphore.wait()
// тут создается HTTP запрос к url и по его окончании вызываются строки
// важно понимать, что без средств синхронизации как semaphore это
// происходит совершенно независимо от Потока 1
// может быть до, может быть после
result = String(data: data!, encoding: String.Encoding.utf8)!
semaphore.signal()
// это происходит когда закончится Поток 2 только потому, что
// semaphore.wait() не закончится пока не вызван semaphore.signal()
return result