Получить данные из 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 NSDatastrong > , поэтому он упрощает работу.
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
.