初步实现文件的缓存管理
This commit is contained in:
parent
d297e50575
commit
34d3c5ad9b
75
dimensionhub/Core/CacheManager.swift
Normal file
75
dimensionhub/Core/CacheManager.swift
Normal 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()
|
||||
}
|
||||
|
||||
}
|
||||
@ -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)")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user