Очередь загрузки m3u8 треков в AVAssetDownloadURLSession не последовательна

Я пытаюсь в семафоре организовать последовательную очередь загрузки треков. Первый и второй треки грузятся нормально. Но всегда, начиная с третьего очередь сбивается и начинают грузится одновременно 3 и 4. Потом 5, 6, 7. и так далее по нарастающей.Как мне добиться чекой последовательности загрузки? 1,2,3,4,5 и так до конца. Спасибо.

final class HLSDownloadManager: NSObject {
    
    static var shared = HLSDownloadManager()
    private var config: URLSessionConfiguration!
    private var downloadSession: AVAssetDownloadURLSession!

    override private init() {
        super.init()
        
        config = URLSessionConfiguration.background(withIdentifier: "\(Bundle.main.bundleIdentifier!).background")
        downloadSession = AVAssetDownloadURLSession(configuration: config, assetDownloadDelegate: self, delegateQueue: nil)
        
    }

   final func setupAssetDownload(_ url: URL) {
        
        let asset = AVURLAsset(url: url, options: nil)

        let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
                                                                 assetTitle: "Test Download",
                                                                 assetArtworkData: nil,
                                                                 options: nil)
        downloadTask?.resume()
    }
    
extension HLSDownloadManager: AVAssetDownloadDelegate {
    
    func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
        var percentComplete = 0.0
  
        for value in loadedTimeRanges {
      
            let loadedTimeRange = value.timeRangeValue
      
            percentComplete += loadedTimeRange.duration.seconds / timeRangeExpectedToLoad.duration.seconds
        }
        percentComplete *= 100

        debugPrint("Progress \( assetDownloadTask) \(percentComplete)")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "completion"), object: nil, userInfo: ["percent": percentComplete])
  
    }

    func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
        UserDefaults.standard.set(location.relativePath, forKey: "assetPath")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "location"), object: nil, userInfo: ["location": location])
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        debugPrint("Task completed: \(task), error: \(String(describing: error))")

        guard error == nil else { return }
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DOWNLOAD: FINISHED"), object: nil)
        print("DOWNLOAD: FINISHED")
    }
    

    
}

final public class OperationDownload {
    
    static var shared = OperationDownload()
    
    let queue = DispatchQueue(label: "com.gcd.myQueue")
    let a = HLSDownloadManager.shared
    var downloadArray: Results< DownloadModel>? = nil
    
    let semaphore = DispatchSemaphore(value: 1)

    func semaphoreDownloadQueue() {
        let urlA = downloadAllAlbum()
        
        queue.async { [weak self] in
            for (n, i) in urlA.enumerated() {
                print("---------", n)
                self?.semaphore.wait()
                self?.hlsDownload(i) { [weak self] in
                    self?.semaphore.signal()
                }
            }
        }
    }
    
    
    func hlsDownload(_ url: String, _ complition: @escaping () -> ()) {
        print("Downloading song")
        self.a.setupAssetDownload(URL(string: url)!)
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "DOWNLOAD: FINISHED"), object: nil, queue: .none ) { (_) in
            complition()
            }
    }
    
    
    /// Считывает из базы все альбомы и возвращаем массив
    func downloadAllAlbum() -> [String] {
        
        var resultArray = [String]()
        let realm = try? Realm()
        downloadArray = realm?.objects(DownloadModel.self)
        guard downloadArray != nil else { return []}
        
        for (_, value) in downloadArray!.enumerated() {
            for ( _, i) in value.tracks.enumerated() {
                resultArray.append(i.track ?? "")
            }
        }
        return resultArray
    }
    
    
    public init() {
    }
    
}

Это нормальная загрузка

"Progress BackgroundAVAssetDownloadTask <472D2C95-A443-41C4-BFEC-5AEA32A12817>.<2> 93.41658124750684"
Таймер 1 секунда
"Progress BackgroundAVAssetDownloadTask <472D2C95-A443-41C4-BFEC-5AEA32A12817>.<2> 95.94305277136783"

"Progress BackgroundAVAssetDownloadTask <472D2C95-A443-41C4-BFEC-5AEA32A12817>.<2> 98.46396994592084"

"Progress BackgroundAVAssetDownloadTask <472D2C95-A443-41C4-BFEC-5AEA32A12817>.<2> 100.0"
"Task completed: BackgroundAVAssetDownloadTask <472D2C95-A443-41C4-BFEC-5AEA32A12817>.<2>, error: nil"

А это проблема с очередью

"Progress BackgroundAVAssetDownloadTask <549FFB84-A8AC-4002-8193-D3DB87BCE1B6>.<4> 3.408738661098413"
"Progress BackgroundAVAssetDownloadTask <6B3355FC-F70A-487C-B894-10EA04DDCFAA>.<3> 7.1797301857396185"
Таймер 1 секунда

"Progress BackgroundAVAssetDownloadTask <6B3355FC-F70A-487C-B894-10EA04DDCFAA>.<3> 9.574888175702357"
"Progress BackgroundAVAssetDownloadTask <549FFB84-A8AC-4002-8193-D3DB87BCE1B6>.<4> 6.817817957618141"

Ответы (0 шт):