swift - Swift - 检查从 URL 下载的文件是否已完成
问题描述
我正在从 M3U8 清单下载 mp4 剪辑,该清单可以包含大约 700 个剪辑。下载它们一切正常,但最好检查单个下载是否完成?下载所有剪辑后,我将它们合并为一个,但我需要知道我的所有剪辑何时首先下载。
这是我用来下载视频剪辑的代码片段。
func download(video: String){
DispatchQueue.global(qos: .background).async {
if let url = URL(string: "http://SERVER/storage/sessions/SESSIONID/mp4_segments/\(video)"),
let urlData = NSData(contentsOf: url) {
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
let fileName = video
let filePath = "\(documentsPath)/SegmentVideos/\(fileName)"
urlData.write(toFile: filePath, atomically: true)
}
}
}
这是读取 M3U8 文件并将其拆分的代码片段,以便我可以获取视频剪辑的名称。
func checkM3U8forClips(){
guard let url = url else {return}
do {
let contents = try String(contentsOf: url)
let splitContent = contents.components(separatedBy: "\n")
for split in splitContent {
if split.hasSuffix("mp4") {
download(video: split)
}
}
} catch {
print("error with mp4 segments: \(error.localizedDescription)")
}
}
解决方案
您陷入困境的一个原因是这段代码是错误的:
if let url = URL(string: "http://SERVER/storage/sessions/SESSIONID/mp4_segments/\(video)"),
let urlData = NSData(contentsOf: url) {
你绝不能用NSData(contentsOf:)
来做网络。如果要联网,请联网:使用 URLSession 和适当的数据任务或下载任务。现在你得到了你需要的回调;如果您以完整的形式执行此操作,您将获得一整套委托回调,这些回调会准确告诉您下载成功和完成(或失败)的时间。
至于您的整体问题,即我如何知道多个异步操作何时全部完成,这就是诸如 DispatchGroup、操作依赖项或新的 Combine 框架之类的东西。
推荐阅读
- c - 如何逐位获取任意十进制数
- python - 无法通过 Windows 终端导入 django
- node.js - 如何删除猫鼬nodejs中id的所有引用?
- python - 条件结构——“if”和“elif”——没有显示正确的结果
- docker - 除非明确调用构建,否则从远程映像中拉取
- java - 将 jar 部署到 unix 服务器
- ruby - 如果 Ruby 中的程序创建散列并将这些散列保存在另一个文件中,它会是什么样子?
- react-native - 如何将对象绑定到 SelectItem 组件?
- java - 在 Java 中,如何限制关闭挂钩仅支持 SIGTERM?
- javascript - 检查所有可见的下拉菜单是否为空 jQuery