初步实现文件的缓存管理

This commit is contained in:
anlicheng 2025-04-13 18:12:58 +08:00
parent d297e50575
commit 34d3c5ad9b
2 changed files with 80 additions and 1 deletions

View File

@ -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()
}
}

View File

@ -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)")
}
}