it-swarm.com.ru

NSURLSession: как увеличить время ожидания для URL-запросов?

Я использую новую NSURLSessionDataTask для iOS 7 для получения данных следующим образом:

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:
request completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
//
}];

Как можно увеличить значения времени ожидания, чтобы избежать ошибки "The request timed out"NSURLErrorDomain Code = -1001)?

Я проверил документацию для NSURLSessionConfiguration , но не нашел способа установить значение времени ожидания.

Спасибо за помощь!

55
AlexR

ObjC

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;

Стриж

let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 60.0
let session = URLSession(configuration: sessionConfig)

Что говорят документы

timeoutIntervalForRequest и timeoutIntervalForResource указывают интервал времени ожидания для запроса, а также ресурс.

timeoutIntervalForRequest - интервал ожидания, используемый при ожидании для дополнительных данных. Таймер, связанный с этим значением, сбрасывается всякий раз, когда поступают новые данные. Когда таймер запроса достигает указанный интервал без получения каких-либо новых данных, запускает тайм-аут.

timeoutIntervalForResource - максимальное количество времени, которое Запрос ресурса должен быть разрешен для принятия. Это значение контролирует, как долго ждать передачи всего ресурса, прежде чем сдаться. Таймер ресурсов запускается, когда запрос инициируется, и считается до либо запрос завершен, либо достигнут этот интервал ожидания, что наступит раньше.

Основанный на Ссылка класса NSURLSessionConfiguration

91
RaffAl

Если разработчик Swift придет сюда

для этого нужно использовать

    let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    urlconfig.timeoutIntervalForRequest = 12
    urlconfig.timeoutIntervalForResource = 12
    self.session = NSURLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil)
16
Sruit A.Suk

В Swift 3. время ожидания 15 секунд.

    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = TimeInterval(15)
    configuration.timeoutIntervalForResource = TimeInterval(15)
    let session = URLSession(configuration: configuration)
8
Danil Shaykhutdinov

NSURLSessionConfiguration включает свойство timeoutIntervalForRequest:

@property NSTimeInterval timeoutIntervalForRequest

контролировать интервал времени ожидания. Существует также timeoutIntervalForResource для тайм-аута после инициирования запроса.

4
Wojtek Surowka

В 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()
}
2
Lineesh K Mohan

Для Swift 4:

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = TimeInterval(15)
config.timeoutIntervalForResource = TimeInterval(15)
let urlSession = URLSession(configuration: config)

Параметр timeoutIntervalForRequest предназначен для всех задач в сеансах на основе этой конфигурации Параметр timeoutIntervalForResource предназначен для всех задач в рамках сеансов на основе этой конфигурации.

1
user9060380

В моем случае я увеличивал время ожидания не того класса. Моя ошибка тайм-аута была решена путем увеличения времени ожидания для URLRequest не для URLSession

var request = URLRequest(url: url)
request.timeoutInterval = 30
0
Nico Dioso