 
  
   
  
   
  
   
  
  do { } while (0). Это и хорошо и плохо. Если поток нужен лишь раз, то смысла в таком очевидно нету. Все потоки по умолчанию такие. Там RunLoop выключен, а значит после работы они умирают. Но иногда нужно держать некий пулл потоков. Это означает держать потоки, которые готовы выполнить новую работу. Задайте вопрос, что лучше, создавать в таком случае каждый раз поток? или держать созданный в спящем режиме, что бы вернуть его для новой работы? Ответ очевидно: Лучше держать поток в спящем режиме. Тут дело в том, что создаётся поток не так быстро, как выводится текущий из спящего. Это делается в целях производительности.  
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
   
  
  Я же с помощью ожидания могу контролировать время ожидания ответа от сервера,- ЧТО? ))) Это умеет делать и сам
URLSession. 
  
  
func asyncDeleteBlackList(then handler: (String) -> Void) {
  let vkUrl = URL(string: "http://url.ru/test/deleteBlackList.php")
  let device: String = "\(shared.nameDevice)"
  let postString = """
                   v=5.80& \
                   lang=ru& \
                   https=1& \
                   device=\(device)& \
                   access_token=\(self.access_token)& \
                   owner_id=\(self.blackList[b].id)
                   """
  var request = URLRequest(url: vkUrl!)
  request.httpBody = postString.data(using: String.Encoding.utf8);
  request.httpMethod = "POST"
  request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")
  request.addValue(shared.userAgent, forHTTPHeaderField: "User-Agent")
  request.addValue("300", forHTTPHeaderField: "content-Length")
  request.addValue("1", forHTTPHeaderField: "X-Get-Processing-Time")
  request.addValue("remixlang=0", forHTTPHeaderField: "Cookie")
  let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error {
      self.handleClientError(error)
      return
    }
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else
    {
        self.handleServerError(response)
        return
    }
    if let data = data,
       let string = String(data: data, encoding: .utf8) {
       handler(string)
    }
  }
  
  task.resume()
}
print("Начали...")
asyncDeleteBlackList { string
  print("Закончили: \(string)")
}
print("А вот тут мы никого не ждём...") 
  
  