Obtenga los datos de NSURLSession DownloadTaskWithRequest desde el manejador de finalización

Entonces me cuesta entender algo. Estas son las cosas que entiendo sobre NSURSession:

Funciona a la perfección El problema es que necesito DESCARGAR los datos en el disco y no solo en la memory (estoy descargando imágenes). Así que he intentado lo mismo con DownloadTaskWithRequest + su manejador de finalización y me he dado count de que los parameters que toma son los mismos que el primero que es NSURL y en DataTaskWithRequest es NSData, por lo que las cosas son mucho más simples. ex

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

Mi pregunta es esta: sé que puedo recuperar los DATOS de la location (NSURL) utilizando:

  var data = NSData(contentsOfURL: location) 

1) Will contentsOfURL hará otra "request" si obtiene estos datos, o si está trabajando localmente? Si vuelve a enviar la request, ¿cómo puedo evitarla?

2) ¿Es esta la manera correcta (sé que puedo usar los methods de delegado, prefiero no hacerlo)?

3) ¿Cómo puedo almacenar localmente los datos que he descargado (después de las preguntas número 1 y 2), y acceder si es necesario?

Gracias chicos !! Lo siento por la pregunta de newibie, realmente me importa la eficiencia: ¡gracias!

Al usar las tareas de descarga, por lo general, uno simplemente usaría la location proporcionada por el completionHandler de la tarea de descarga para simplemente mover el file de su location temporal a la location final de su elección (por ejemplo, a la carpeta Documentos o Caché) usando NSFileManager .

 let task = NSURLSession.shanetworkingSession().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() 

También podría cargar el object en un NSData utilizando contentsOfURL . Sí, funciona con resources locales. Y, no, no hará otra request … si miras la URL, es una URL de file en tu sistema de files local. Pero se pierden gran parte de los ahorros de memory de las tareas de descarga de esta manera, por lo que puede utilizar una tarea de datos si realmente desea getla en un NSData . Pero si desea moverlo al almacenamiento persistente, el patrón anterior probablemente tenga sentido, evitando utilizar un object NSData completo.