2016-01-03 1 views
1

J'ai une fonction où je fais une demande pour obtenir un JSON.NSURLSession timeout

let request = NSMutableURLRequest(URL: NSURL(string: path)!) 
let session = NSURLSession.sharedSession() 

session.configuration.timeoutIntervalForRequest = 5 
session.configuration.timeoutIntervalForResource = 5 

let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
    let json:JSON = JSON(data: data!) 
    onCompletion(json, error) 
}) 
task.resume() 

Cela fonctionne, mais j'ai des problèmes avec le délai d'expiration. Si la demande prend plus de 5 secondes, je veux annuler l'opération. Des idees pour faire cela?

L'appel peut prendre plus de 5 secondes, mais il reste allumé et le délai d'expiration ne fait rien. Dois-je faire quelque chose si le délai d'attente est expiré?

Mise à jour

 let request = NSMutableURLRequest(URL: NSURL(string: path)!) 

     let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration() 
     urlconfig.timeoutIntervalForRequest = 5 
     urlconfig.timeoutIntervalForResource = 5 
     let session = NSURLSession(configuration: urlconfig, delegate: self, delegateQueue: nil) 

     let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
      let json:JSON = JSON(data: data!) 
      onCompletion(json, error) 
     }) 
     task.resume() 
+0

vous utilisez déjà la demande d'intervalle de temps pendant 5 sec. De quoi d'autre avez-vous besoin? –

+0

Cela ne fonctionne pas ... J'ai essayé de changer cette valeur à 0.01 et il a encore chargé quand il a fallu plus de 4 secondes pour charger. Dois-je gérer si timeoutIntervalForRequest ou timeoutIntervalForResource est déclenché? –

+0

@ Mr.T, ce n'est pas un doublon J'ai lu ce post et vérifier mon commentaire ci-dessus. –

Répondre

3

Vous ne pouvez pas modifier le délai d'attente sur la propriété sharedSession ou sessions configuration. Vous devez définir le délai d'expiration lorsque la session est créée. Voir ceci pour un exemple de comment créer une session et son timeout: https://stackoverflow.com/a/30427187/78496

+0

Je ne comprends pas comment intégrer ce post avec mon code, des idées? –

+3

@ user5700760 - Remplacez votre ligne 'let session = ...' par les quatre lignes de cette réponse (bien que plutôt que de faire référence à 'self.session', vous pouvez simplement vous référer à' session'). Le point clé est d'instancier votre propre 'NSURLSessionConfiguration', de définir ses paramètres de timeout, puis d'instancier votre propre' NSURLSession' en utilisant cette configuration plutôt que d'utiliser la session partagée. – Rob

+0

J'ai maintenant mis à jour mon code (voir la mise à jour dans ma question), mais maintenant quand le code atteint le délai il se bloque à 'let json: JSON = JSON (données: données!)' Avec le message: erreur fatale: inattendue nil lors du déballage d'une valeur optionnelle –