为什么我的 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
。运行时不会神奇地读懂您的想法并知道您打算将此对象作为委托;你必须告诉它。
我的大部分编程经验都在 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
。运行时不会神奇地读懂您的想法并知道您打算将此对象作为委托;你必须告诉它。