TSCommonTool+MultDown.swift 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // MultiTaskDown.swift
  3. // Pods
  4. //
  5. // Created by 100Years on 2025/3/17.
  6. //
  7. public extension TSCommonTool {
  8. /// 多任务下载并缓存文件,依据 URL 的后缀名动态设置文件名
  9. /// - Parameters:
  10. /// - url: 文件的 URL 地址
  11. /// - completion: 完成回调,返回本地缓存路径或错误
  12. public static func multidownloadAndCacheFile(
  13. from urlString: String,
  14. fileEx:String? = nil,
  15. missingEx:String? = nil,
  16. cacheDirectory:String = "cacheAll",
  17. progressHandler: @escaping (Double) -> Void,
  18. completion: @escaping (String?, Error?) -> Void) -> TSMultiTaskDownloader?
  19. {
  20. guard let url = URL(string: urlString) else{
  21. completion(nil, NSError(domain: "url null", code: 0))
  22. return nil
  23. }
  24. guard let cachedFileURL = checkURLString(
  25. from: urlString,
  26. fileEx: fileEx,
  27. missingEx: missingEx,
  28. cacheDirectory: cacheDirectory,
  29. completion: completion
  30. ) else {
  31. return nil
  32. }
  33. let fileManager = FileManager.default
  34. //检查文件是否已存在于缓存中
  35. if fileManager.fileExists(atPath: cachedFileURL.path) {
  36. print("文件已存在于缓存中: \(cachedFileURL)")
  37. completion(cachedFileURL.path, nil)
  38. return nil
  39. }
  40. let downloader = TSMultiTaskDownloader.shared
  41. downloader.downloadFile(from: url, progressHandler: { progress in
  42. print("Download progress for file1: \(progress * 100)%")
  43. progressHandler(progress)
  44. }, completionHandler: { tempFileURL, error in
  45. if let error = error {
  46. DispatchQueue.main.async {
  47. completion(nil, error)
  48. }
  49. return
  50. }
  51. guard let tempFileURL = tempFileURL else {
  52. DispatchQueue.main.async {
  53. completion(nil, NSError(domain: "DownloadError", code: -1, userInfo: [NSLocalizedDescriptionKey: "临时文件路径不存在"]))
  54. }
  55. return
  56. }
  57. do {
  58. if fileManager.fileExists(atPath: cachedFileURL.path) {
  59. try fileManager.removeItem(atPath:cachedFileURL.path)
  60. dePrint("下载成功,移除已有的旧文件: \(cachedFileURL)")
  61. }
  62. try fileManager.moveItem(at: tempFileURL, to: cachedFileURL)
  63. dePrint("文件下载并缓存成功: \(cachedFileURL)")
  64. DispatchQueue.main.async {
  65. completion(cachedFileURL.path, nil)
  66. }
  67. } catch {
  68. dePrint("文件下载成功,但失败:\(error)")
  69. DispatchQueue.main.async {
  70. completion(nil, error)
  71. }
  72. }
  73. })
  74. return downloader
  75. }
  76. }