Очередь загрузки 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"