From 34d3c5ad9ba7b35bb40eaaeeb826f389e5fc9251 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Sun, 13 Apr 2025 18:12:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E7=BC=93=E5=AD=98=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dimensionhub/Core/CacheManager.swift | 75 ++++++++++++++++++++ dimensionhub/Views/Index/IndexMainView.swift | 6 +- 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 dimensionhub/Core/CacheManager.swift diff --git a/dimensionhub/Core/CacheManager.swift b/dimensionhub/Core/CacheManager.swift new file mode 100644 index 0000000..376b28e --- /dev/null +++ b/dimensionhub/Core/CacheManager.swift @@ -0,0 +1,75 @@ +// +// CacheManager.swift +// dimensionhub +// +// Created by 安礼成 on 2025/4/13. +// + +import Foundation +import CommonCrypto + +final class CacheManager { + + static let shared = CacheManager() + + private let cacheDir: URL + + private init() { + let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask) + self.cacheDir = paths[0] + } + + func preloadImages(urls: [String]) async throws { + // 批量异步加载 + try await withThrowingTaskGroup(of: Void.self) { group in + for url in urls { + group.addTask { + if let data = try? await self.downloadImage(from: url) { + try? self.saveCacheFile(filename: "xx", data: data) + } + } + } + try await group.waitForAll() + } + } + + // 保存文件到缓存 + private func saveCacheFile(filename: String, data: Data) throws { + let fileURL = cacheDir.appendingPathComponent(filename) + try data.write(to: fileURL) + } + + // 下载图片 + private func downloadImage(from urlString: String) async throws -> Data? { + guard let url = URL(string: urlString) else { + return nil + } + + let request = URLRequest(url: url, timeoutInterval: 5000) + let (data, response) = try await URLSession.shared.data(for: request) + guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { + return nil + } + + return data + } + + // 获取缓存的文件名 + func getCacheFileName(urlString: String) -> String? { + guard let url = URL(string: urlString) else { + return nil + } + + return sha256(str: urlString) + "." + url.pathExtension.lowercased() + } + + private func sha256(str: String) -> String { + let data = Data(str.utf8) + var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) + data.withUnsafeBytes { bytes in + _ = CC_SHA256(bytes.baseAddress, CC_LONG(data.count), &hash) + } + return hash.map { String(format: "%02hhx", $0) }.joined() + } + +} diff --git a/dimensionhub/Views/Index/IndexMainView.swift b/dimensionhub/Views/Index/IndexMainView.swift index 2baf117..dd9cccb 100644 --- a/dimensionhub/Views/Index/IndexMainView.swift +++ b/dimensionhub/Views/Index/IndexMainView.swift @@ -80,7 +80,6 @@ struct IndexMainView: View { } .frame(width: 370) .coordinateSpace(name: "indexScrollView") - .onPreferenceChange(FooterOffsetPreferenceKey.self) { offset in // 延迟到当前帧结束更新state的值,避免导致循环更新的警告 DispatchQueue.main.async { @@ -143,6 +142,11 @@ struct IndexMainView: View { .onPreferenceChange(DramaGroupElementPreferenceKey.self) { frames in indexModel.visiblePublisher.send(frames) } + .onAppear { + let x = CacheManager.shared.getCacheFileName(urlString: "https://www.baidu.com/x/y/z.jpg?ts=1234") + let x1 = CacheManager.shared.getCacheFileName(urlString: "https://www.baidu.com/x/y/z.jpg") + print("x: \(x), x1: \(x1)") + } }