Подтвердить что ты не робот

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, но не нашел способ установить значение тайм-аута.

Благодарим за помощь!

4b9b3361

Ответ 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