为什么我的URLDownloadTask没有调用didFinishDownloadtingTo?

时间:2016-08-23 02:08:22

标签: swift nsurlsession nsurlsessiondownloadtask

我的大多数编程经验都在Shell和Python中。我对Swift很新,比如“3天前”新手。我无法弄清楚为什么在我的downloadTask完成时没有调用FininDownloadtingTo。这是我的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,而我却找不到足够的文档来自行解决这个问题。

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

似乎成功下载了该文件。我试过几个网址。调试菜单的“磁盘”和“网络”部分看起来与在我测试过的每个URL下载大小的文件一致。

2 个答案:

答案 0 :(得分:7)

当你在Swift 3中使用NSURLSessionURLSession)时,你必须选择是否要使用委托或完成处理程序,如果同时使用,只需完成处理程序被调用。在您的情况下,delegate未设置,因此您无法看到对委托方法的调用。相反,您应该使用delegate的另一个初始化程序指定NSURLSession,如下面的代码所示:

@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!")
   }   
}

然后你应该看到正确调用委托方法。

我希望这可以帮到你

答案 1 :(得分:1)

关键在于“委托”这个词。这就像夏洛克·福尔摩斯故事中夜间的狗。狗在夜里什么也没做。 “委托”一词从未出现在您的代码中!

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