Commit 63c05ef8 authored by shenyong's avatar shenyong

首页数据构造修改

parent a7703dda
......@@ -45,6 +45,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
AdvManager.shared.initAdertisementSDK()
PMEmailManager.shareManager.restore()
// 相册基本资源加载
PhotoManager.shared.config()
return true
......
......@@ -260,3 +260,14 @@ class TrashDatabase {
sqlite3_close(db)
}
}
extension TrashDatabase{
func dealHomeData(type:Int){
}
}
import Foundation
import Photos
actor AssetSizeCache {
static let shared = AssetSizeCache()
private let cache: NSCache<NSString, NSNumber> = NSCache<NSString, NSNumber>()
private let fileQueue = DispatchQueue(label: "com.assetsize.fileoperations", qos: .utility)
// 临时存储,用于跟踪修改
private var tempStorage: [String: Int64] = [:]
private var hasChanges: Bool = false
private let cachePath: String = {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0].appendingPathComponent("AssetSizeCache.plist").path
}()
private init() {
Task {
await loadCache()
}
}
private func loadCache() {
fileQueue.sync {
if let dict = NSDictionary(contentsOfFile: cachePath) as? [String: Int64] {
for (key, value) in dict {
cache.setObject(NSNumber(value: value), forKey: key as NSString)
tempStorage[key] = value
}
}
}
}
func getSize(for asset: PHAsset) -> Int64? {
// 优先从内存缓存中读取
if let size = tempStorage[asset.localIdentifier] {
return size
}
return cache.object(forKey: asset.localIdentifier as NSString)?.int64Value
}
func setSize(_ size: Int64, for asset: PHAsset) {
cache.setObject(NSNumber(value: size), forKey: asset.localIdentifier as NSString)
tempStorage[asset.localIdentifier] = size
hasChanges = true
}
// 手动触发保存到文件
func saveToFile() {
guard hasChanges else { return }
let path = self.cachePath
let storageToSave = self.tempStorage
fileQueue.async {
(storageToSave as NSDictionary).write(toFile: path, atomically: true)
}
hasChanges = false
}
func clearCache() {
cache.removeAllObjects()
tempStorage.removeAll()
hasChanges = true
let path = self.cachePath
fileQueue.async {
try? FileManager.default.removeItem(atPath: path)
}
}
}
//
// PhotoCleanTool.swift
// PhoneManager
//
// Created by edy on 2025/5/15.
//
import Foundation
struct PhotoCleanTool{
// app内手动删除资源
func deleteLocalResouces(for ids:[String]){
let other = PhotoManager.shared.otherModels.filter{ids.contains($0.localIdentifier)}
let screen = PhotoManager.shared.screenShotModels.filter{ids.contains($0.localIdentifier)}
let video = PhotoManager.shared.videoModels.filter{ids.contains($0.localIdentifier)}
PhotoManager.shared.otherModels = other
PhotoManager.shared.screenShotModels = screen
PhotoManager.shared.videoModels = video
}
// 删除无效资源
func cleanIneffectiveResources(){
}
}
......@@ -88,6 +88,15 @@ class PhotoManager{
// 重复图片分组
var duplicateModels:[[AssetModel]] = []
// 过滤垃圾桶/保留相似图片分组
var filterSimilarModels:[[AssetModel]] = []
// 过滤垃圾桶/保留相似截图分组
var filterSimilarScreenShotModels:[[AssetModel]] = []
// 过滤垃圾桶/保留相似视频分组
var filterSimilarVideoModels:[[AssetModel]] = []
// // 过滤垃圾桶/保留重复图片分组
// var filterDuplicateModels:[[AssetModel]] = []
// 截图
var screenShotModels:[AssetModel] = []
// 视频
......@@ -95,6 +104,14 @@ class PhotoManager{
// 其他
var otherModels:[AssetModel] = []
// 过滤垃圾桶/保留截图
var filterScreenShotModels:[AssetModel] = []
// 过滤垃圾桶/保留视频
var filterVideoModels:[AssetModel] = []
// 过滤垃圾桶/保留其他
var filterOtherModels:[AssetModel] = []
private(set) var screenShotTotalSize:Int64 = 0
private(set) var videoTotalSize:Int64 = 0
private(set) var otherTotalSize:Int64 = 0
......@@ -331,13 +348,30 @@ extension PhotoManager{
// 获取文件大小
func getAssetSize(for asset:PHAsset) ->Int64{
// func getAssetSize(for asset:PHAsset) ->Int64{
// if let resource = PHAssetResource.assetResources(for: asset).first,
// let size = resource.value(forKey: "fileSize") as? Int64 {
// return size
// } else {
// return 0
// }
// }
func getAssetSize(for asset: PHAsset) async -> Int64 {
// 先尝试从缓存获取
if let cachedSize = await AssetSizeCache.shared.getSize(for: asset) {
return cachedSize
}
// 如果缓存中没有,则计算大小
if let resource = PHAssetResource.assetResources(for: asset).first,
let size = resource.value(forKey: "fileSize") as? Int64 {
// 将计算结果存入缓存
await AssetSizeCache.shared.setSize(size, for: asset)
return size
} else {
return 0
}
return 0
}
......@@ -585,6 +619,10 @@ extension PhotoManager{
}
}
func getTotalSize(source:[[AssetModel]]) ->Double{
return source.flatMap{$0}.reduce(0){$0+$1.assetSize}
}
// 获取所有资产的总数
// func fetchTotalAssets(completion: @escaping ([PHAsset]) -> Void) {
// DispatchQueue.global(qos: .background).async {
......@@ -606,10 +644,9 @@ extension PhotoManager{
// }
}
extension PhotoManager{
// 批量转模型
func convertAssetsToModel(for assets: [PHAsset], mediaType: Int) async -> [AssetModel] {
let batchSize = 4 // 控制并发数量
var results: [AssetModel] = []
......@@ -624,7 +661,7 @@ extension PhotoManager{
group.addTask {
return AssetModel(
localIdentifier: asset.localIdentifier,
assetSize: Double(self.getAssetSize(for: asset)),
assetSize: Double(await self.getAssetSize(for: asset)),
createDate: asset.creationDate ?? Date(),
mediaType: mediaType
)
......@@ -640,6 +677,7 @@ extension PhotoManager{
return results
}
// 获取总数据
func getModelsData(){
Task{
let start = CFAbsoluteTimeGetCurrent()
......@@ -660,3 +698,5 @@ extension PhotoManager{
}
}
}
......@@ -10,7 +10,7 @@ import Photos
import UIKit
@MainActor
class PhotoSimilarManager: @unchecked Sendable {
static let shared = PhotoSimilarManager()
......@@ -198,7 +198,6 @@ class PhotoSimilarManager: @unchecked Sendable {
} else {
assetSize = 0
}
let model = AssetModel(
localIdentifier: asset.localIdentifier,
assetSize: assetSize,
......
......@@ -9,7 +9,7 @@ import Foundation
import Photos
import UIKit
@MainActor
class ScreenshotSimilarJSONManager: @unchecked Sendable {
static let shared = ScreenshotSimilarJSONManager()
......
......@@ -44,7 +44,7 @@ private actor VideoAssetCacheManager {
}
@MainActor
class VideoSimilarJSONManager: @unchecked Sendable {
static let shared = VideoSimilarJSONManager()
private let stateManager = VideoSimilarStateManager()
......
......@@ -162,6 +162,9 @@ class CustomProgressBar: UIView {
var chaoticProgress: CGFloat = 0 {
didSet {
guard chaoticProgress != oldValue else{
return
}
scheduleProgressUpdate()
}
}
......@@ -240,7 +243,7 @@ class CustomProgressBar: UIView {
guard let self = self else { return }
// 计算总容量和各部分比例
let total = max(self.totalProgress, 0.001) // 避免除以0
let total = max(self.totalProgress + self.chaoticProgress, 0.001) // 避免除以0
let usedRatio = min(max(self.usedProgress / total, 0), 1)
let chaoticRatio = min(max(self.chaoticProgress / total, 0), 1)
......
......@@ -281,6 +281,14 @@ class HomeOtherCollectionCell: UICollectionViewCell {
}else{
self.sizeLabel.text = String(format: "(%.2lf) GB" ,sizeKB/(1000 * 1000))
}
let placeImage = self.mediaType == 0 ? "othermoren" : self.mediaType == 2 ? "photosmoren" : "videosmoren"
if let id = model.assets.first?.first?.localIdentifier{
imageView.asset.load(withLocalIdentifier:id,placeholder: UIImage(named: placeImage))
}else{
self.imageView.image = UIImage.init(named: placeImage)
}
}
......
......@@ -131,18 +131,26 @@ class HomeTitleCollectionCell:UICollectionViewCell {
fileLabel?.text = "\(count)" + " Photos " + (model.allFileSize > 0 ? "(\(formatFileSize(model.allFileSize)))" : "(Calculating...)")
fileLabel?.sizeToFit()
collectionView?.reloadData()
}
func reloadCoverData(_ assets:[AssetModel]){
assetsModels.removeAll()
assetsModels = assets.compactMap({ model in
return ImageCollectionModel.init(asset: model)
})
Print("刷新头部封面\(self)",assets.count)
collectionView?.reloadData()
if let assets = model.assets.first{
assetsModels = assets.compactMap({ model in
return ImageCollectionModel.init(asset: model)
})
collectionView?.reloadData()
}
}
// func reloadCoverData(_ assets:[AssetModel]){
// assetsModels.removeAll()
// assetsModels = assets.compactMap({ model in
// return ImageCollectionModel.init(asset: model)
// })
// Print("刷新头部封面\(self)",assets.count)
// collectionView?.reloadData()
// }
override func layoutSubviews() {
super.layoutSubviews()
......
......@@ -47,8 +47,6 @@ class ImageCollectionCell:UICollectionViewCell {
backImageView?.asset.load(withLocalIdentifier: model.asset.localIdentifier,placeholder: UIImage.init(named: "othermoren"))
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment