初步实现文件的缓存管理
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)
|
.frame(width: 370)
|
||||||
.coordinateSpace(name: "indexScrollView")
|
.coordinateSpace(name: "indexScrollView")
|
||||||
|
|
||||||
.onPreferenceChange(FooterOffsetPreferenceKey.self) { offset in
|
.onPreferenceChange(FooterOffsetPreferenceKey.self) { offset in
|
||||||
// 延迟到当前帧结束更新state的值,避免导致循环更新的警告
|
// 延迟到当前帧结束更新state的值,避免导致循环更新的警告
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
@ -143,6 +142,11 @@ struct IndexMainView: View {
|
|||||||
.onPreferenceChange(DramaGroupElementPreferenceKey.self) { frames in
|
.onPreferenceChange(DramaGroupElementPreferenceKey.self) { frames in
|
||||||
indexModel.visiblePublisher.send(frames)
|
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