在下面的代码中,文件下载就行了.然而,没有一个代理方法似乎被调用,因为我没有收到任何输出. progressView也没有更新.任何想法为什么?
import Foundation
import UIKit
class podcast: PFQueryTableViewController,UINavigationControllerDelegate,MWFeedParserDelegate,UITableViewDataSource,NSURLSessionDelegate,NSURLSessionDownloadDelegate {
func downloadEpisodeWithFeedItem(episodeURL: NSURL) {
var request: NSURLRequest = NSURLRequest(URL: episodeURL)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config,delegate: self,delegateQueue: nil)
var downloadTask = session.downloadTaskWithURL(episodeURL,completionHandler: { (url,response,error) -> Void in
println("task completed")
if (error != nil) {
println(error.localizedDescription)
} else {
println("no error")
println(response)
}
})
downloadTask.resume()
}
func URLSession(session: NSURLSession,downloadTask: NSURLSessionDownloadTask,didResumeAtOffset fileOffset: Int64,expectedTotalBytes: Int64) {
println("didResumeAtOffset")
}
func URLSession(session: NSURLSession,didWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) {
var downloadProgress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
println(Float(downloadProgress))
println("sup")
epCell.progressView.progress = Float(downloadProgress)
}
func URLSession(session: NSURLSession,didFinishDownloadingToURL location: NSURL) {
println(location)
}
}
解决方法
从我的测试中,您必须选择是否要使用委托或完成处理程序 – 如果同时指定,只有完成处理程序被调用.这段代码给我运行进度更新和didFinishDownloadingToURL事件:
func downloadEpisodeWithFeedItem(episodeURL: NSURL) {
let request: NSURLRequest = NSURLRequest(URL: episodeURL)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config,delegateQueue: NSOperationQueue.mainQueue())
let downloadTask = session.downloadTaskWithURL(episodeURL)
downloadTask.resume()
}
func URLSession(session: NSURLSession,expectedTotalBytes: Int64) {
println("didResumeAtOffset: \(fileOffset)")
}
func URLSession(session: NSURLSession,totalBytesExpectedToWrite: Int64) {
var downloadProgress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
println("downloadProgress: \(downloadProgress)")
}
func URLSession(session: NSURLSession,didFinishDownloadingToURL location: NSURL) {
println("didFinishDownloadingToURL: \(location)")
println(downloadTask)
}
从NSURLSession documentation,这里是相关部分:
Like most networking APIs,the NSURLSession API is highly asynchronous. It returns data in one of two ways,depending on the methods you call:
- To a completion handler block that returns data to your app when a transfer finishes successfully or with an error.
- By calling methods on your custom delegate as the data is received.
- By calling methods on your custom delegate when download to a file is complete.
因此,通过设计,它将数据返回到完成处理程序块或代理.但是在这里证明,不是两者.