web-dev-qa-db-fra.com

NSURLSession: Comment augmenter le délai d'attente pour les demandes d'URL?

J'utilise la nouvelle variable NSURLSessionDataTask d'iOS 7 pour récupérer les données comme suit:

NSURLSession *session = [NSURLSession sharedSession];

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

Comment puis-je augmenter les valeurs de délai d'attente pour éviter l'erreur "The request timed out" (dans NSURLErrorDomain Code = -1001)?

J'ai vérifié la documentation de NSURLSessionConfiguration mais je n'ai pas trouvé de moyen de définir la valeur du délai d'attente.

Merci de votre aide!

55
AlexR

ObjC

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

Rapide

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

Que disent les docs

timeoutIntervalForRequest et timeoutIntervalForResource spécifient l'intervalle de temporisation pour la demande ainsi que pour la ressource.

timeoutIntervalForRequest - Intervalle de temporisation à utiliser lors de l'attente pour des données supplémentaires. Le temporisateur associé à cette valeur est réinitialisé chaque fois que de nouvelles données arrivent. Lorsque le temporisateur de demande atteint le intervalle spécifié sans recevoir de nouvelles données, il déclenche un temps libre.

timeoutIntervalForResource - La durée maximale pendant laquelle un demande de ressource devrait être autorisé à prendre. Cette valeur contrôle comment longtemps à attendre pour une ressource entière à transférer avant d'abandonner. Le le temporisateur de ressource démarre lorsque la demande est lancée et compte jusqu'à la demande est terminée ou cet intervalle de temps est atteint, peu importe lequel vient en premier.

Basé sur Référence de classe NSURLSessionConfiguration

91
RaffAl

Si le développeur Swift vient ici

pour ce faire, vous devez utiliser

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

Dans Swift 3. délai d'attente 15 secondes.

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

NSURLSessionConfiguration inclut la propriété timeoutIntervalForRequest:

@property NSTimeInterval timeoutIntervalForRequest

pour contrôler l'intervalle de temporisation. Il existe également timeoutIntervalForResource pour le délai d'attente après le lancement de la demande.

4
Wojtek Surowka

Dans Swift 3.0, vous devez utiliser

 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

Pour Swift 4:

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

TimeoutIntervalForRequest concerne toutes les tâches des sessions basées sur cette configuration . timeoutIntervalForResource concerne toutes les tâches des sessions basées sur cette configuration.

1
user9060380

Dans mon cas, j'augmentais le délai d'attente de la mauvaise classe. Mon erreur de délai d'attente a été résolue en augmentant le délai d'attente de URLRequest pas du URLSession

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