Могу ли я каким-то образом выполнить синхронный HTTP-запрос через NSURLSession в Swift

Могу ли я каким-то образом выполнить синхронный HTTP-запрос через NSURLSession в Swift?

Я могу выполнить asynchronous запрос через следующий код:

 if let url = NSURL(string: "https://2ch.hk/b/threads.json") { let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in var jsonError: NSError? let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as [String: AnyObject] if jsonError != nil { return } // ... } task.resume() } 

Но как насчет синхронного запроса?

Заранее спасибо.

Вы можете использовать это расширение NSURLSession, чтобы добавить синхронный метод:

 extension NSURLSession { func synchronousDataTaskWithURL(url: NSURL) -> (NSData?, NSURLResponse?, NSError?) { var data: NSData?, response: NSURLResponse?, error: NSError? let semaphore = dispatch_semaphore_create(0) dataTaskWithURL(url) { data = $0; response = $1; error = $2 dispatch_semaphore_signal(semaphore) }.resume() dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) return (data, response, error) } } 

Обновление для Swift 3:

 extension URLSession { func synchronousDataTask(with url: URL) -> (Data?, URLResponse?, Error?) { var data: Data? var response: URLResponse? var error: Error? let semaphore = DispatchSemaphore(value: 0) let dataTask = self.dataTask(with: url) { data = $0 response = $1 error = $2 semaphore.signal() } dataTask.resume() _ = semaphore.wait(timeout: .distantFuture) return (data, response, error) } } 

Apple обсуждает ту же проблему.

 + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(__autoreleasing NSURLResponse **)responsePtr error:(__autoreleasing NSError **)errorPtr { dispatch_semaphore_t sem; __block NSData * result; result = nil; sem = dispatch_semaphore_create(0); [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (errorPtr != NULL) { *errorPtr = error; } if (responsePtr != NULL) { *responsePtr = response; } if (error == nil) { result = data; } dispatch_semaphore_signal(sem); }] resume]; dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); return result; } 

Ответа на этот вопрос Quinn “The Eskimo!” Отношения с разработчиками Apple, Техническая поддержка разработчиков, ОС Core / Hardware

Обновлен один из ответов на использование URLRequest, поэтому мы можем использовать PUT и т. Д.

 extension URLSession { func synchronousDataTask(urlrequest: URLRequest) -> (data: Data?, response: URLResponse?, error: Error?) { var data: Data? var response: URLResponse? var error: Error? let semaphore = DispatchSemaphore(value: 0) let dataTask = self.dataTask(with: urlrequest) { data = $0 response = $1 error = $2 semaphore.signal() } dataTask.resume() _ = semaphore.wait(timeout: .distantFuture) return (data, response, error) } } 

Я звоню вот так.

 var request = URLRequest(url: url1) request.httpBody = body request.httpMethod = "PUT" let (_, _, error) = URLSession.shared.synchronousDataTask(urlrequest: request) if let error = error { print("Synchronous task ended with error: \(error)") } else { print("Synchronous task ended without errors.") } 

Будьте осторожны с синхронными запросами, потому что это может привести к плохой работе с пользователем, но иногда я знаю, что это необходимо. Для синхронных запросов используйте NSURLConnection:

 func synchronousRequest() -> NSDictionary { //creating the request let url: NSURL! = NSURL(string: "exampledomain/...") var request = NSMutableURLRequest(URL: url) request.HTTPMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") var error: NSError? var response: NSURLResponse? let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) error = nil let resultDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSDictionary return resultDictionary } 
  • Почему не конвертируется в ?
  • Как я могу рассчитать разницу между двумя датами?
  • NSRange для диапазона
  • Xcode Beta 6.1 и Xcode 6 GM заклеили индексирование по странной причине
  • Xcode Version 6.1 (6A1030) - Ошибка Apple-O-Linker - создание
  • Массив кортежей в Свифте
  • Вычисление средней функции массива Swift
  • Итерация через словарь в Swift
  • Переменные classа еще не поддерживаются.
  • Назначить xib для UIView в Swift
  • Как обнаружить одну кнопку в ячейке таблицы
  • Interesting Posts

    ASP.NET Custom 404 Возврат 200 OK вместо 404 не найден

    Как я могу предотвратить Windows 10 от любого сна или спящего режима при запуске скрипта python?

    Windows 10: назначить одну и ту же букву диска на внешний диск

    Кодирование и декодирование QR-кода с использованием zxing

    Google DFP – изменение размера пользовательского объявления SafeFrame внешнего контейнера iframe изнутри (развернуть объявление)

    Как использовать ssh-copy-id на нестандартном порту

    Копирование многострочного текста в одну ячейку в Excel

    Как определить, находится ли 2D-точка внутри многоугольника?

    оператор post increment java

    Правильный способ преобразования байта в java в unsigned char * в C ++ и наоборот?

    Как выбрать URL-адрес моей Spring Boot Webapp?

    Ограничение импорта приложений create-react-app вне каталога src

    Безопасный (проверенный граница) поиск массива в Swift через дополнительные привязки?

    Рабочий процесс для статистического анализа и составления отчетов

    Как связать динамический контент с помощью ?

    Давайте будем гением компьютера.