Swift - 检查 URL 的文件下载是否完成

Swift - Check if the file download from a URL is completed

我正在从包含大约 700 个剪辑的 M3U8 清单下载 mp4 剪辑。下载它们一切正常,但是检查单个下载是否完成的最佳方法是什么?下载完所有剪辑后,我将它们合并为一个,但我需要知道我的所有剪辑何时首先下载。

这是我用来下载视频剪辑的代码片段。

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 框架之类的问题。