Swift 未调用UrlSessionLegate方法
首先,我已经检查了类似的现有问题,没有一个答案适用。Swift 未调用UrlSessionLegate方法,swift,urlsession,Swift,Urlsession,首先,我已经检查了类似的现有问题,没有一个答案适用。 我正在尝试使用URLSessionDownloadTask下载一个文件,如下所示 class MyNetworkManager : NSObject { static let instance = MyNetworkManager() var downloadSession : URLSession? init() { super.init() let download
我正在尝试使用
URLSessionDownloadTask
下载一个文件,如下所示
class MyNetworkManager : NSObject
{
static let instance = MyNetworkManager()
var downloadSession : URLSession?
init()
{
super.init()
let downloadConfiguration = URLSessionConfiguration.default
downloadSession = URLSession(configuration: downloadConfiguration, delegate: self, delegateQueue: nil)
}
func download(_ url : URL)
{
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
let downloadTask = downloadSession?.downloadTask(with: urlRequest)
downloadTask?.resume()
}
}
extension MyNetworkManager : URLSessionDelegate
{
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64)
{
//
}
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL)
{
//
}
func urlSession(_ session: URLSession,
task: URLSessionTask,
didCompleteWithError error: Error?)
{
//
}
}
但是,没有调用urlsessionelegate
方法
通常,如果使用完成处理程序创建任务,则不会调用委托方法-事实并非如此,我只是在创建任务时使用URLRequest
作为参数
会话的委托
已正确设置,调用downloadTask?.resume()后,其状态
属性为正在运行
MyNetworkManager
是一个单身汉,我就是这样使用它的
MyNetworkManager.instance.download(someURL)
因此,一个实例肯定会被保留
我在这里遗漏了什么吗?您必须遵守相关协议,例如:
extension MyNetworkManager: URLSessionDelegate {
// this is intentionally blank
// obviously, if you implement any delegate methods for this protocol, put them here
}
extension MyNetworkManager: URLSessionDownloadDelegate {
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
print(#function)
}
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL) {
print(#function)
}
}
extension MyNetworkManager: URLSessionTaskDelegate {
func urlSession(_ session: URLSession,
task: URLSessionTask,
didCompleteWithError error: Error?) {
print(#function, error ?? "No error")
}
}
如果您不遵守,它将不会调用URLSessionDownloadDelegate
方法。在错误的签名委托方法之间,可能会很快发布的MyNetworkManager
实例,缺少委托方法(假设您出错而未成功),等等。它缺少一些信息。@Larme不是这样,MyNetworkManager
实例为retained@matt说得好。编辑了这个问题MyNetworkManager
是一个单例,尝试使用MyNetworkManager.instance.download(someURL)