为什么我的 URLDownloadTask 不调用 didFinishDownloadtingTo?

Why does my URLDownloadTask not call didFinishDownloadtingTo?

我的大部分编程经验都在 Shell 和 Python 中。我是 Swift 的新手,比如“3 天前”。我只是想不通为什么在我的 downloadTask 完成时没有调用 didFinishDownloadtingTo。这是我的 AppDelegate.swift 文件:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, URLSessionDelegate, URLSessionDownloadDelegate {

@IBOutlet weak var window: NSWindow!
@IBOutlet var progressind: NSProgressIndicator!
@IBOutlet var outputtext: NSTextField!



func applicationDidFinishLaunching(_ aNotification: Notification) {

    // Insert code here to initialize your application
    let requestURL: URL = URL(string: "https://www.apple.com")!
    let urlRequest: URLRequest = URLRequest(url: requestURL as URL)
    let session = URLSession.shared
    let downloads = session.downloadTask(with: urlRequest)
    print("starting download...")
    downloads.resume()

}

func applicationWillTerminate(_ aNotification: Notification) {
    // Insert code here to tear down your application
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
    print("download finished!")
}


}

我正在使用 Swift 3,但我找不到足够的文档来自己解决这个问题。

我有点疯狂地宣布 类 试图弄清楚为什么它不能正常工作,所以我确信那里也有一些错误。

看来下载文件成功了。我试过几个 URLs。调试菜单的 "Disk" 和 "Network" 部分看起来与我测试过的每个 URL 下载大小一致的文件。

问题是,当你使用 NSURLSession(URLSession in Swift 3) 时,你必须选择是使用委托还是完成处理程序,以防两者都使用,只调用完成处理程序。在您的情况下, delegate 未设置,因此您看不到对委托方法的调用。相反,您应该使用 NSURLSession 的另一个初始值设定项指定 delegate,如以下代码所示:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, URLSessionDelegate, URLSessionDownloadDelegate {

   func applicationDidFinishLaunching(_ aNotification: Notification) {
      let requestURL: URL = URL(string: "https://www.apple.com")!
      let urlRequest: URLRequest = URLRequest(url: requestURL as URL)

      let config = URLSessionConfiguration.default
      let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

      let downloads = session.downloadTask(with: urlRequest)

      print("starting download...")
      downloads.resume()
   }

   func applicationWillTerminate(_ aNotification: Notification) {
      // Insert code here to tear down your application
   }

   func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
       print("download finished!")
   }   
}

然后您应该会看到正确调用了委托方法。

希望对你有所帮助

关键就在"delegate"两个字上。就像夏洛克·福尔摩斯故事中夜间的狗。狗在晚上什么也没做。 "delegate" 一词从未出现在您的代码中!

但它需要。 didFinishDownloadingTo 是一个 delegate 方法。如果您是 NSURLSession 的委托,您只能接收此方法。您需要将 self 设置为其 delegate。运行时不会神奇地读懂您的想法并知道您打算将此对象作为委托;你必须告诉它。