Из моего тестирования вам нужно выбрать, хотите ли вы использовать делегат или обработчик завершения - если вы укажете оба, вызывается только обработчик завершения. Этот код дал мне текущие обновления и событие didFinishDownloadingToURL
:
func downloadEpisodeWithFeedItem(episodeURL: NSURL) {
let request: NSURLRequest = NSURLRequest(URL: episodeURL)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config, delegate: self, delegateQueue: NSOperationQueue.mainQueue())
let downloadTask = session.downloadTaskWithURL(episodeURL)
downloadTask.resume()
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
println("didResumeAtOffset: \(fileOffset)")
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
var downloadProgress = Double(totalBytesWritten) / Double(totalBytesExpectedToWrite)
println("downloadProgress: \(downloadProgress)")
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
println("didFinishDownloadingToURL: \(location)")
println(downloadTask)
}
Из NSURLSession
документации , вот соответствующий раздел:
Как и большинство сетевых API, API NSURLSession отличается высокой асинхронностью. Он возвращает данные одним из двух способов, в зависимости от методов, которые вы вызываете:
blockquote >
- К блоку обработчика завершения, который возвращает данные в ваше приложение, когда передача завершается успешно или с ошибкой.
- Вызов методов вашего пользовательского делегата при получении данных.
- Вызов методов в пользовательском делететете, когда загрузка в файл завершена.
Поэтому по дизайну он возвращает данные либо блоку обработчика завершения, либо делегату. Но, как показано здесь, не оба.