所以我很难理解某些事情。这是我对NSURSession的理解:
一般来说,我有2个选项(据我所知) DataTask(ex dataTaskWithRequest)和 DownloadTask(ex DownloadTaskWithRequest ) - 使用他们的委托方法,或使用完成处理程序,不能同时执行这两种操作。 我已经设法使用dataTaskWithRequest接收DATA,如下所示:
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 ,因此它使事情变得更加简单。 离。
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)中获取DATA:
var data = NSData(contentsOfURL: location)
1) contentsOfURL 会发出另一个"请求"得到这些数据,还是他在本地工作?如果它再次发送请求,我该如何避免呢?
2)这是正确的方式(我知道我可以使用委托方法,我不喜欢)?
3)如何在本地存储我已下载的数据(在问题1和2回答之后),并在需要时访问它?
谢谢你们!对不起新手问题,我真的非常关心高效 - 谢谢!
答案 0 :(得分:14)
使用下载任务时,通常只需使用下载任务的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
对象。