如何在Swift中直接将mp4下载到我的硬盘?

时间:2015-07-11 19:44:50

标签: xcode swift download

我使用此代码下载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更友好?

我还注意到,在下载完成之前我得到了死轮,所以如果有关修复的建议也会受到赞赏。

2 个答案:

答案 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)

这是我使用的代码段,它将加载的数据写入给定路径的文件中。