10

所以我很难理解一些事情。这是我对 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 + 他的完成处理程序进行了相同的尝试,我注意到他采用的参数与第一个参数相同,即NSURLDataTaskWithRequest中的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()

我的问题是:我知道我可以使用以下方法从 Location(NSURL) 中获取数据:

    var data = NSData(contentsOfURL: location)

1)contentsOfURL会发出另一个“请求”来获取这些数据,还是他在本地工作?如果它再次发送请求,我该如何避免它?

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

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

感谢你们!!抱歉新手问题,我真的很关心效率 - 谢谢!

4

1 回答 1

15

使用下载任务时,通常只需使用下载任务location提供的completionHandler将文件从其临时位置移动到您选择的最终位置(例如到 Documents 或 Cache 文件夹),使用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()

您当然也可以将对象加载到NSDatausing 中contentsOfURL。是的,它适用于本地资源。而且,不,它不会发出另一个请求……如果您查看 URL,它是本地文件系统中的文件 URL。但是这样会失去下载任务的大部分内存节省,因此如果您真的想将数据任务放入NSData. 但是如果你想将它移动到持久存储,上面的模式可能是有意义的,NSData完全避免使用一个对象。

于 2015-04-06T16:34:50.703 回答