我需要知道如何在与代表的URLsession中捕获错误(主要是中断)。
我在自定义类中有以下Swift函数,它下载一个小文件来测试下载速度:
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()
}
}
此课程使用URLSessionDelegate
和URLSessionDownloadDelegate
。以下是它所称的当前代表:
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])
}
^监视下载进度并使用NotificationCenter将进度发送回视图控制器。
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)
}
^只需在下载完成后计算速度,然后将结果发送到另一个类中的全局变量。不重要的。
截至目前,当我测试我的应用程序时,中断下载只会挂起应用程序,因为它一直在等待processFinished
NC调用,这显然永远不会出现。
我是否应该添加另一个代表以捕获中断,或者我错过了一些更明显的内容?