Swift - Проверьте, завершена ли загрузка файла с URL - PullRequest
0 голосов
/ 15 января 2020

Я загружаю клипы mp4 из манифеста M3U8, который может содержать около 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)")
           }
   }

1 Ответ

2 голосов
/ 15 января 2020

Одна из причин, по которой вы попали в затруднительное положение, заключается в том, что этот код неверен:

 if let url = URL(string: "http://SERVER/storage/sessions/SESSIONID/mp4_segments/\(video)"),
     let urlData = NSData(contentsOf: url) {

Вы должны никогда использовать NSData(contentsOf:) для работы в сети. Если вы хотите подключиться к сети, то по сети: используйте URLSession и соответствующую задачу с данными или задачу загрузки. Теперь вы получаете обратные вызовы, которые вам нужны; если вы делаете это в полной форме, вы получаете полный набор обратных вызовов делегатов, которые точно сообщают вам, когда загрузка прошла успешно и завершена (или не удалась).

Что касается вашего общего вопроса, т.е. как я могу знать, когда все асинхронные операции завершены, для чего предназначены вещи, такие как DispatchGroup, или зависимости операций, или новая платформа Combine.

...