2017-04-02 3 views
1

Je dois savoir comment intercepter les erreurs (interruptions, principalement) dans une session URL avec des délégués.Swift 3: Gérer les erreurs dans les délégués URLSession

J'ai la fonction suivante Swift dans une classe personnalisée, qui permet de télécharger un petit fichier pour tester la vitesse de téléchargement:

func testSpeed() { 

    Globals.shared.dlStartTime = Date() 
    Globals.shared.DownComplete = false 


    let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil) 

    let task = session.downloadTask(with: url!) 

    if Globals.shared.currentSSID == "" { 
     Globals.shared.bandwidth = 0 
     Globals.shared.DownComplete = true 

     session.invalidateAndCancel() 

     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ProcessFinished"), object: nil, userInfo: nil) 

    } else { 
     print("Running Task") 
     task.resume() 

    } 
} 

Cette classe utilise URLSessionDelegate et URLSessionDownloadDelegate. Voici les délégués actuels, il appelle:

public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { 
    Globals.shared.dlFileSize = (Double(totalBytesExpectedToWrite) * 8)/1000 
    let progress = (Double(totalBytesWritten)/Double(totalBytesExpectedToWrite)) * 100.0 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ProcessUpdating"), object: nil, userInfo: ["progress" : progress]) 
} 

^Ce on surveille la progression du téléchargement et utilise NotificationCenter pour envoyer le progrès au contrôleur de vue.

public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { 
    print("Done") 
    if Globals.shared.DownComplete == false { 
     let elapsed = Double(Date().timeIntervalSince(Globals.shared.dlStartTime)) 
     Globals.shared.bandwidth = Int(Globals.shared.dlFileSize/elapsed) 
     Globals.shared.DownComplete = true 
     Globals.shared.dataUse! += (Globals.shared.dlFileSize!/8000) 
    } 
    session.invalidateAndCancel() 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ProcessFinished"), object: nil, userInfo: nil) 
} 

^Que l'on calcule que la vitesse une fois le téléchargement terminé, et envoie le résultat à une variable globale dans une autre classe. Sans importance. À partir de maintenant, lorsque je teste mon application, interrompre le téléchargement bloque simplement l'application, car il continue à attendre l'appel NC processFinished, qui évidemment ne vient jamais.

Y a-t-il un autre délégué que je devrais ajouter pour attraper cette interruption, ou est-ce que je manque quelque chose de plus évident?

Répondre

1

Vous pouvez utiliser urlSession: tâche: didCompleteWithError méthode déléguée

enter image description here

+0

drôle est que je l'avais essayé avant, et cela n'a pas fonctionné. Mais maintenant c'est le cas. Je suppose que c'était juste une de ces nombreuses choses dans Xcode qui pépient parfois. –