1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- //
- // MultiTaskDown.swift
- // Pods
- //
- // Created by 100Years on 2025/3/17.
- //
- public extension TSCommonTool {
-
- /// 多任务下载并缓存文件,依据 URL 的后缀名动态设置文件名
- /// - Parameters:
- /// - url: 文件的 URL 地址
- /// - completion: 完成回调,返回本地缓存路径或错误
- public static func multidownloadAndCacheFile(
- from urlString: String,
- fileEx:String? = nil,
- missingEx:String? = nil,
- cacheDirectory:String = "cacheAll",
- progressHandler: @escaping (Double) -> Void,
- completion: @escaping (String?, Error?) -> Void) -> TSMultiTaskDownloader?
- {
-
- guard let url = URL(string: urlString) else{
- completion(nil, NSError(domain: "url null", code: 0))
- return nil
- }
-
-
- guard let cachedFileURL = checkURLString(
- from: urlString,
- fileEx: fileEx,
- missingEx: missingEx,
- cacheDirectory: cacheDirectory,
- completion: completion
- ) else {
- return nil
- }
-
- let fileManager = FileManager.default
- //检查文件是否已存在于缓存中
- if fileManager.fileExists(atPath: cachedFileURL.path) {
- print("文件已存在于缓存中: \(cachedFileURL)")
- completion(cachedFileURL.path, nil)
- return nil
- }
-
-
- let downloader = TSMultiTaskDownloader.shared
- downloader.downloadFile(from: url, progressHandler: { progress in
- print("Download progress for file1: \(progress * 100)%")
- progressHandler(progress)
- }, completionHandler: { tempFileURL, error in
- if let error = error {
- DispatchQueue.main.async {
- completion(nil, error)
- }
- return
- }
-
- guard let tempFileURL = tempFileURL else {
- DispatchQueue.main.async {
- completion(nil, NSError(domain: "DownloadError", code: -1, userInfo: [NSLocalizedDescriptionKey: "临时文件路径不存在"]))
- }
- return
- }
-
- do {
- if fileManager.fileExists(atPath: cachedFileURL.path) {
- try fileManager.removeItem(atPath:cachedFileURL.path)
- dePrint("下载成功,移除已有的旧文件: \(cachedFileURL)")
- }
- try fileManager.moveItem(at: tempFileURL, to: cachedFileURL)
- dePrint("文件下载并缓存成功: \(cachedFileURL)")
- DispatchQueue.main.async {
- completion(cachedFileURL.path, nil)
- }
- } catch {
- dePrint("文件下载成功,但失败:\(error)")
- DispatchQueue.main.async {
- completion(nil, error)
- }
- }
- })
-
- return downloader
- }
-
- }
|