【发布时间】:2017-02-13 16:33:26
【问题描述】:
我正在构建一个 iOS 应用程序,用户可以在其中下载不同的文件。
我正在使用URLSessionDownloadTask 和URLSession 异步下载文件。
下载完成后,目标文件夹默认为tmp/ 目录。
因此,当下载结束时,我需要将临时文件移动到另一个目录。
对于图片或歌曲,这只需 1 秒甚至更短。
但是当文件是视频时,例如,最多可能需要 15 秒。
问题
为了让用户仍能与应用进行交互,我想将此移动设为异步。
每次我尝试这样做时,文件管理器都会引发异常。
“CFNetworkDownload_xxxxxx.tmp”无法移动到“下载”,因为前者不存在,或者包含后者的文件夹不存在。
我尝试了什么
我试图将文件管理器的调用放在后台线程中,它抛出了。
我尝试在调用 move 方法之前删除目标文件,以确保该文件不存在。
在从tmp/ 目录中删除文件之前,我尝试调用copy 函数。
我的代码
对文件管理器的调用看起来像这样。
func simpleMove(from location: URL, to dest: URL) -> Bool {
let fileManager = FileManager.default
do {
try fileManager.moveItem(at: location, to: dest)
return true
} catch {
print("\(error.localizedDescription)")
return false
}
}
当我把它放在后台线程中时,我会这样做。
DispatchQueue.global().async {
if !simpleMove(from: location, to: dest) {
//Failure
}
}
问题
如何在不影响 UI 的情况下移动一个非常大的文件?
将文件直接下载到永久目录中将是一个更好的解决方案。我该怎么做?
当我同步调用我的simpleMove(from:to:) 时,它运行良好。
那么,为什么错误说目标目录不存在? (或类似的东西,我不确定那个错误的含义)
谢谢。
注意
上面的代码是用 Swift 3 编写的,但如果您有 Objective-C 或 Swift 2 的答案,
也欢迎分享!
【问题讨论】:
-
你找出原因了吗?我太坚持这个了。
标签: ios asynchronous download nsurlsession nsfilemanager