从完成处理程序获取来自NSURLSession DownloadTaskWithRequest的数据

所以我很难理解一些东西。 这是我对NSURSession的理解:

  • 一般来说,我有2个选项(据我所知) DataTask(ex dataTaskWithRequest)DownloadTask(ex DownloadTaskWithRequest ) – 使用他们的委托方法, 使用完成处理程序,不能做两个。 我设法接收数据使用dataTaskWithRequest像这样:

    let request = NSMutableURLRequest(URL: dataSourceURL!) request.HTTPMethod = "POST" let postString = "lastid=\(id)" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in if error != nil { println("error=\(error)") return } if data != nil { println("works") //Handle data } //println("response = \(response)") } task.resume() 

它完美的作品。 问题是我需要将数据下载到磁盘,而不仅仅是内存(我正在下载图像)。 所以我试着与DownloadTaskWithRequest +他的完成处理程序相同,我已经注意到,他采取的参数是相同的期望第一个是NSURLDataTaskWithRequestNSData,所以它使事情变得更简单。 的eX

  let task2 = NSURLSession.sharedSession().downloadTaskWithRequest(request, completionHandler: { (location : NSURL!, response : NSURLResponse!, error : NSError?) -> Void in if error != nil { return } //How do i get the data?? }) task2.resume() 

我的问题是这样的:我知道我可以获取数据的位置(NSURL)使用:

  var data = NSData(contentsOfURL: location) 

1)请问contentsOfURL会让另一个“请求”得到这个数据,还是他在本地工作? 如果再次发送请求,我怎么能避免它?

2)这是正确的方法(我知道我可以使用委托方法,我不喜欢)?

3)如何在本地存储我下载的数据(问题1和2后回答),并在需要时访问它?

感谢你们!! 对不起newibie的问题,我真的很在乎高效 – 谢谢!

使用下载任务时,通常只需使用下载任务的completionHandler提供的location ,即可简单地使用NSFileManager将文件从其临时位置移动到您select的最终位置(例如文档或caching文件夹)。

 let task = NSURLSession.sharedSession().downloadTaskWithURL(url) { location, response, error in guard location != nil && error == nil else { print(error) return } let fileManager = NSFileManager.defaultManager() let documents = try! fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) let fileURL = documents.URLByAppendingPathComponent("test.jpg") do { try fileManager.moveItemAtURL(location!, toURL: fileURL) } catch { print(error) } } task.resume() 

您当然也可以使用contentsOfURL将对象加载到NSData中。 是的,它与当地的资源一起工作。 而且,不,它不会提出另一个请求……如果您查看URL,则它是本地文件系统中的文件URL。 但是,这样下载任务会节省很多内存,所以如果你真的想把它放到一个NSData ,你可能会使用一个数据任务。 但是如果你想把它移动到永久存储,上面的模式可能是有道理的,避免使用一个NSData对象。