Skip to content

Instantly share code, notes, and snippets.

@groz
Last active February 27, 2018 13:24
Show Gist options
  • Save groz/3cbc8a827b7c0f950beca9e01584c95d to your computer and use it in GitHub Desktop.
Save groz/3cbc8a827b7c0f950beca9e01584c95d to your computer and use it in GitHub Desktop.
For Sultik

Рассмотрим функцию query

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment