NSURLSession: Как увеличить время ожидания запросов URL?
Я использую iOS 7 new NSURLSessionDataTask
для извлечения данных следующим образом:
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:
request completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
//
}];
Как увеличить значения тайм-аута, чтобы избежать ошибки "The request timed out"
(в NSURLErrorDomain
Code = -1001
)?
Я проверил документацию для NSURLSessionConfiguration, но не нашел способ установить значение тайм-аута.
Благодарим за помощь!
Ответы
Ответ 1
ObjC
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;
Swift
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 60.0
let session = URLSession(configuration: sessionConfig)
Что говорят документы
timeoutIntervalForRequest
и timeoutIntervalForResource
укажите интервал времени ожидания для запроса, а также ресурса.
timeoutIntervalForRequest
. Интервал таймаута для использования при ожидании для получения дополнительных данных. Таймер, связанный с этим значением, равен resetпри поступлении новых данных. Когда таймер запроса достигает указанного интервала без получения каких-либо новых данных, он запускает тайм-аут.
timeoutIntervalForResource
- максимальное время, в течение которого запрос ресурсов должен быть разрешен. Это значение определяет, как чтобы ждать передачи всего ресурса перед сдачей. таймер ресурса запускается, когда запрос инициируется и рассчитывается до тех пор, пока либо запрос завершается, либо этот интервал времени ожидания достигнут, в зависимости от того, что наступит раньше.
На основе Ссылка класса NSURLSessionConfiguration
Ответ 2
В случае появления разработчика Swift
для этого вам нужно использовать
let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
urlconfig.timeoutIntervalForRequest = 12
urlconfig.timeoutIntervalForResource = 12
self.session = NSURLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil)
Ответ 3
В режиме быстрого 3. таймаута 15 секунд.
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = TimeInterval(15)
configuration.timeoutIntervalForResource = TimeInterval(15)
let session = URLSession(configuration: configuration)
Ответ 4
NSURLSessionConfiguration включает в себя свойство timeoutIntervalForRequest:
@property NSTimeInterval timeoutIntervalForRequest
для управления интервалом таймаута. Существует также timeoutIntervalForResource для таймаута после запуска запроса.
Ответ 5
В SWIFT 3.0 вам нужно использовать
if let cleanURLString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed),
let theURL: Foundation.URL = Foundation.URL(string: cleanURLString) {
var task:URLSessionDataTask?
let urlconfig = URLSessionConfiguration.default
urlconfig.timeoutIntervalForRequest = 20
urlconfig.timeoutIntervalForResource = 60
let session = Foundation.URLSession(configuration: urlconfig, delegate: self, delegateQueue: OperationQueue.main)
let request = URLRequest(url: theURL)
request.httpMethod = "POST"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
let paramString = YourParameterString
request.httpBody = paramString.data(using: String.Encoding.utf8)
task = session.dataTask(with: request) {
(data, response, error) in
// Do here
})
dataTask.resume()
}
Ответ 6
Для Swift 4:
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = TimeInterval(15)
config.timeoutIntervalForResource = TimeInterval(15)
let urlSession = URLSession(configuration: config)
TimeoutIntervalForRequest предназначен для всех задач в сеансах на основе этой конфигурации.
TimeoutIntervalForResource предназначен для всех задач в сеансах на основе этой конфигурации.
Ответ 7
В моем случае я увеличивал время ожидания не того класса. Ошибка тайм-аута была устранена путем увеличения времени ожидания URLRequest, а не URLSession
var request = URLRequest(url: url)
request.timeoutInterval = 30