0

我正在使用以下代码下载约 200mb 的播客并将其写入 Documents 目录:

var podcastRequest = NSURLRequest(URL: audioUrl)
NSURLConnection.sendAsynchronousRequest(podcastRequest, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
if let myPodcastDataFromUrl = NSData(contentsOfURL: audioUrl) {

    if myPodcastDataFromUrl.writeToURL(destinationUrl, atomically: true) {

        // add to the array to track the download
        var tempDic = self.posts[theRow] as! NSMutableDictionary as NSMutableDictionary
        tempDic["downloaded"] = "true"
        self.posts[theRow] = tempDic
    } else {
        println("Error saving file")
    }
}

})

sendAsynchronousRequest 调用可防止在下载期间发生锁定,但应用程序在开始实际将其写入目录时仍会冻结。

有没有办法完全防止锁定发生,或者我将不得不一次写入更小的块?

4

1 回答 1

1

在尝试将 200MB 写入磁盘之前,您将无法在内存中存储 200MB,但您可以使用 downloadTaskWithURL 方法,它将文件写入临时文件夹,当完成后您可以将其移动到文档文件夹,如下所示。

let documentsDirectoryURL =  NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL

NSURLSession.sharedSession().downloadTaskWithURL(audioUrl, completionHandler: {
    (location, response, error) -> Void in

    if let error = error {
        println(error.description)
    }
    else {
        if NSFileManager().moveItemAtURL(location, toURL: documentsDirectoryURL.URLByAppendingPathComponent(response.suggestedFilename!), error: nil) {
            println("saved")
        } else {
            println("not saved.")
        }
    }
}).resume()
于 2015-05-05T22:02:15.347 回答