Получить данные из NSURLSession DownloadTaskWithRequest из обработчика завершения

Так что мне сложно что-то понять. Вот что я понимаю о NSURSession:

  • Как правило, у меня есть 2 варианта (насколько я знаю) DataTask (ex dataTaskWithRequest) И DownloadTask (ex DownloadTaskWithRequest) - использование метода делегата, или использовать обработчик завершения, Cant сделать оба. Мне удалось получить DATA с помощью 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 + его обработчиком завершения, и я заметил, что параметры, которые он принимает, одинаковы, ожидайте первый, который является NSURL и в DataTaskWithRequest NSData​​strong > , поэтому он упрощает работу. e.X

 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()

Мой вопрос таков: Я знаю, что могу извлечь DATA из местоположения (NSURL), используя:

    var data = NSData(contentsOfURL: location)

1) Будет ли contentsOfURL сделать другой запрос, чтобы получить эти данные или что он работает локально? Если он снова отправляет запрос, как я могу его избежать?

2) Правильно ли это (я знаю, что могу использовать методы делегата, я не предпочитаю)?

3) Как я могу сохранить данные, которые я загрузил (после ответов на вопросы номер 1 и 2) локально, и, если необходимо, получить к нему доступ?

Спасибо, ребята! Извините за вопрос newibie, я действительно забочусь об эффективности - Спасибо!

Ответ 1

При использовании задач загрузки обычно можно просто использовать location, предоставленный completionHandler задачи загрузки, чтобы просто переместить файл из своего временного местоположения в конечное местоположение по вашему выбору (например, в документы или кеш ) с помощью NSFileManager.

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()

Вы также можете загрузить объект в NSData с помощью contentsOfURL. Да, он работает с местными ресурсами. И нет, он не сделает другого запроса... если вы посмотрите на URL-адрес, это URL-адрес файла в локальной файловой системе. Но вы потеряете большую часть экономии памяти для задач загрузки таким образом, чтобы вы могли использовать задачу данных, если вы действительно хотели получить ее в NSData. Но если вы хотите перенести его в постоянное хранилище, то, вероятно, имеет смысл использовать вышеприведенный шаблон, избегая при этом использования объекта NSData.