我使用此代码下载mp4文件:
func downloadImageFile() {
let myURLstring = getImageURLCM()
let myFilePathString = "/Users/jack/Desktop/Comics/"+getTitle()+".mp4"
let url = NSURL(string: myURLstring)
let dataFromURL = NSData(contentsOfURL: url!)
let fileManager = NSFileManager.defaultManager()
fileManager.createFileAtPath(myFilePathString, contents: dataFromURL, attributes: nil)
}
但我注意到,在NSFileManager
将文件保存到我的硬盘驱动器之前,该文件实际上已加载到我的 RAM 中(基于Xcode
调试会话)。这对于较小的文件是可以忍受的,但我想用此下载的大多数文件至少为1GB
。
我的主要问题是:如何使这个RAM更友好?
我还注意到,在下载完成之前我得到了死轮,所以如果有关修复的建议也会受到赞赏。
答案 0 :(得分:2)
最好使用NSURLSession中的系统管理下载,特别是NSURLDownloadTask。这样您就不必担心大量下载的内存管理。来自NSURLSession swift文件
/*
* download task convenience methods. When a download successfully
* completes, the NSURL will point to a file that must be read or
* copied during the invocation of the completion routine. The file
* will be removed automatically.
*/
func downloadTaskWithURL(url: NSURL, completionHandler: (NSURL?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDownloadTask?
下面的使用示例 - 复制并粘贴到新的Swift Playground:
import UIKit
import XCPlayground
func downloadFile(filePath: String) {
let url = NSURL(string: filePath)
if let unwrappedURL = url {
let downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(unwrappedURL) { (urlToCompletedFile, reponse, error) -> Void in
// unwrap error if present
if let unwrappedError = error {
print(unwrappedError)
}
else {
if let unwrappedURLToCachedCompletedFile = urlToCompletedFile {
print(unwrappedURLToCachedCompletedFile)
// Copy this file to your destinationURL with
//NSFileManager.defaultManager().copyItemAtURL
}
}
}
downloadTask?.resume()
}
}
downloadFile("http://devstreaming.apple.com/videos/wwdc/2015/711y6zlz0ll/711/711_networking_with_nsurlsession.pdf?dl=1")
XCPSetExecutionShouldContinueIndefinitely()
github上的简单示例 - https://github.com/serendipityapps/NSURLSessionDownloadTaskExample
答案 1 :(得分:1)
dataFromURL.writeToFile(myFilePathString, atomically: true)
这是我使用的代码段,它将加载的数据写入给定路径的文件中。