Swift 为什么我的URLDownloadTask不调用DidFinishDownloadingTo?
我的大部分编程经验都是用Shell和Python编写的。我对斯威夫特相当陌生,就像“3天前”一样。我只是不明白为什么在我的下载任务完成时没有调用DidFinishDownloadingTo。这是我的AppDelegate.swift文件:Swift 为什么我的URLDownloadTask不调用DidFinishDownloadingTo?,swift,nsurlsession,nsurlsessiondownloadtask,Swift,Nsurlsession,Nsurlsessiondownloadtask,我的大部分编程经验都是用Shell和Python编写的。我对斯威夫特相当陌生,就像“3天前”一样。我只是不明白为什么在我的下载任务完成时没有调用DidFinishDownloadingTo。这是我的AppDelegate.swift文件: import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate, URLSessionDelegate, URLSessionDownloadDelegat
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。“调试”菜单的“磁盘”和“网络”部分似乎与在我测试过的每个URL上下载的文件大小一致。问题是,当您在Swift 3中使用(
URLSession
)时,您必须选择是要使用委托还是完成处理程序,如果同时使用这两个,则只会调用完成处理程序。在您的情况下,委托
未设置,因此您无法看到对委托方法的调用。相反,您应该使用另一个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!")
}
}
然后您应该看到正确调用了委托方法
我希望这对您有所帮助关键在于“代表”这个词。这就像福尔摩斯故事中夜间的狗。那条狗在夜里什么也没做。“委托”一词永远不会出现在您的代码中
但它需要这样做
didFinishDownloadingTo
是一种委托方法。仅当您是NSURLSession的代理时,才能接收此方法。您需要将self
设置为其委托
。运行时不会神奇地读懂您的心思,并知道您打算将此对象作为委托;你必须说出来。你想做什么?只是测试目的?如果你想下载东西,我建议你看看Alamofire。使用CocoapodsI之类的依赖关系管理器我只是想从静态网页获取文件。这将在应用程序完成时出现一次,因此下载并学习使用整个网络库下载一个文件进行应用程序的初始设置目前对我来说似乎有点太复杂了。是的,的确是@matt,但问题是,他使用的是URLSession.shared
,而URLSession
中的代理是只读的,至少用这种方式是不可能的。@VictorSigler完全正确。我只是想把概念弄清楚。问题是“我就是不明白为什么没有调用didfinishdownloadingto
”。答案是我说的:因为你不是代表。我没有说你的答案是错误的(尽管事实上你关于完成处理程序的讨论完全偏离了主题)。你的回答有助于告诉OP该做什么。但我的回答有助于回答OP实际提出的问题。我想,这个世界足够容纳这两种情况。@matt我已经将didFinishDownloadingTo包含在我的appDelegate中,并且在配置会话时,我确实将委托设置为self,但我仍然没有使用该方法。还有其他想法吗?为什么委托方法不会被调用?全部细节在这里:这是完美的工作!这就引出了第二个问题。我仍然不确定代表们是如何“联系”在一起或一起工作的,或是什么。在本例中,“self”是我的AppDelegate.swift文件吗?如果是这样,将“self”替换为“DownloadDelegate”会告诉我的程序在“DownloadDelegate.swift”中查找“didFinishDownloadingTo”方法吗?@user6684500不,这不是委托模式的处理方式,委托很容易理解,如果你仔细看,你将函数委托给另一个对象,委托对象保留对委托的另一个对象的引用,并在适当的时间向其发送消息,您可以阅读更多有关该对象的信息。如果解决了您的问题,请接受答案:)