第47月第11天 iOS 文件下载Download,支持断点续传、后台下载、设置下载并发数
1. iOS 文件下载Download,支持断点续传、后台下载、设置下载并发数
/// 开始下载 private func start(url: String) { guard url.dw_isURL else { return } if let task = getTask(url: url) { let runningModels = sessionModels.filter { (key, value) -> Bool in return value.states == .start } if let model = getSessionModel(taskIdentifier: task.taskIdentifier) { if runningModels.count < maxDownloadCount { task.resume() model.states = .start } else { model.states = .waiting } } } } private func waitingTask() { let waitingModel = sessionModels.filter { (key, value) -> Bool in return value.states == .waiting } if let sessionModel = waitingModel.first { let model = sessionModel.value if let url = model.model.url { start(url: url) } } }
extension DownloadManager: URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { if let error = error, error.localizedDescription == "cancelled" { return } guard let model = sessionModels["\(task.taskIdentifier)"], let url = model.model.url, url.dw_isURL else { return } if let error = error { if model.states != .suspended && error.localizedDescription != "The request timed out." { debugPrint("下载失败") model.states = .failed } } else { debugPrint("下载完成") model.states = .completed } // 关闭流 model.stream?.close() model.stream = nil // 清除任务 tasks.removeValue(forKey: url.dw_getFileName) sessionModels.removeValue(forKey: "\(task.taskIdentifier)") waitingTask() } }