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?
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. –