Swift 3:处理URLSession委托中的错误

时间:2017-04-02 20:36:01

标签: ios swift delegates nsurlsession

我需要知道如何在与代表的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()

    }
}

此课程使用URLSessionDelegateURLSessionDownloadDelegate。以下是它所称的当前代表:

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调用,这显然永远不会出现。

我是否应该添加另一个代表以捕获中断,或者我错过了一些更明显的内容?

1 个答案:

答案 0 :(得分:1)

您可以使用urlSession:task:didCompleteWithError委托方法

enter image description here