写入非常大的文件时应用程序冻结/锁定
App freezes / locks up when writing very large files
我正在使用以下代码下载约 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 调用可防止在下载过程中发生锁定,但应用程序在实际开始将其写入目录时仍会冻结。
有没有办法完全防止锁定发生,或者我是否必须一次写入较小的块?
在尝试将其写入磁盘之前,您将无法在内存中存储 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()
我正在使用以下代码下载约 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 调用可防止在下载过程中发生锁定,但应用程序在实际开始将其写入目录时仍会冻结。
有没有办法完全防止锁定发生,或者我是否必须一次写入较小的块?
在尝试将其写入磁盘之前,您将无法在内存中存储 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()