2016-11-12 1 views
3

Je veux m'assurer que je suis en train d'implémenter URLSessionTaskDelegate et URLSessionDataDelegate correctement. Je les utilise, car je veux être capable de suivre les progrès. Voici le code à ce jour:Gestion correcte des délégués de session

final public fileprivate(set) var data:  Data? 
final public fileprivate(set) var response: URLResponse? 
final public fileprivate(set) var error: Error? 


public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {   
    if let response = response as? HTTPURLResponse, response.statusCode == 200 { 
     data = Data() 
    } 

    self.response = response 

    completionHandler(.allow) 
} 

public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { 
    self.data?.append(data) 
} 

public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { 
    self.error = error 

    // ... Work with downloaded data 
} 

et quelques questions:

  1. Dois-je toujours effectuer completionHandler en réponse didReceive, et doit-il toujours être Laissez charger? Peut-être que je devrais le faire seulement si le code d'état de réponse est 200?
  2. Le code d'état 200 est-il le seul que j'ai vraiment besoin de vérifier dans ce cas et est-ce le bon endroit pour initialiser les données? Peut-être que cette fonction peut être exécutée plusieurs fois avec des codes différents et que je devrais traiter n'importe quel code différemment?
  3. Est-ce que didCompleteWithError est le seul endroit où j'ai besoin d'attribuer une erreur? Peut-être que des erreurs peuvent aussi être générées dans différents endroits?
  4. Dans la documentation pour URLResponse, je peux voir la valeur par défaut de expectedContentLength est NSURLResponseUnknownLength, mais cette valeur n'existe pas. Y a-t-il un nouveau nom pour ça maintenant?
  5. Y at-il autre chose que je devrais savoir pour que ce code soit universel?

Répondre

1
  1. Si le status code n'est pas 200, souvent le corps de la réponse contient des informations qui vous aide à analyser pourquoi il n'a pas été 200, de sorte que vous voulez sans doute continuer à saisir cette information. Je déplacerais probablement ce code d'état en vérifiant didCompleteWithError. En règle générale, je m'attends à 200 et je ne vérifie donc que 200. Techniquement, tous les codes 2xx sont des codes de «succès», donc vous pouvez envisager de réussir tous. C'est à toi de voir. Le didCompleteWithError est la seule erreur liée à la connexion. Théoriquement, vous voudrez peut-être vérifier urlSession(_:didBecomeInvalidWithError:). Vous pouvez également affecter votre propre code d'erreur si vous obtenez un code d'état autre que 2xx ou, à un niveau supérieur, si l'analyse de la réponse a échoué. Ils ne semblent pas avoir défini une constante appropriée de Swift 3. FYI, en regardant les en-têtes, vous pouvez voir la valeur est -1, mais souvent nous vérifions simplement response.expectedContentLength < 0.

+0

Merci pour l'explication. Donc, je vais créer data = Data() toujours dans la réponse de didReceive et je vais vérifier les codes d'état après didCompleteWithError. –