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:
- 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?
- 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?
- 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?
- 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?
- Y at-il autre chose que je devrais savoir pour que ce code soit universel?
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. –