我的大多数编程经验都在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下载大小的文件一致。
答案 0 :(得分:7)
当你在Swift 3中使用NSURLSession
(URLSession
)时,你必须选择是否要使用委托或完成处理程序,如果同时使用,只需完成处理程序被调用。在您的情况下,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
。运行时并没有神奇地读懂你的想法,并且知道你打算将这个对象作为委托;你必须告诉它。