Commit 6591ae36 authored by CZ1004's avatar CZ1004

【优化】修复BUG

parent 46bd273a
......@@ -41,7 +41,7 @@ class AdvTipDeleteView : UIView {
var freeDeleteCount : Int = 0
var dataSource : [AssetModel]?
var dataSource : [AssetModel] = []
var tipDeleteModel : AdvTipModel = AdvTipModel(titleText: "", detailTitleText: "", showLessButton: false, deleteMoreText: "", deleteLessText: "")
......@@ -198,8 +198,8 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
func getOtherInfoByType(type : PhotsFileType) {
// 首先获取第一个button显示的内容
let photosCount = self.dataSource!.count > 25 ? 25 : self.dataSource?.count
let deleteButtonTitle = "Delete \(photosCount ?? 0) \(type.rawValue)"
let photosCount = self.dataSource.count > 25 ? 25 : self.dataSource.count
let deleteButtonTitle = "Delete \(photosCount) \(type.rawValue)"
var deleteLessText = ""
if type == .videos || type == .SimilarVideos {
......@@ -271,16 +271,22 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSource!.count
return dataSource.count > 25 ? 25 : dataSource.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ImageCell.reuseIdentifier, for: indexPath) as! ImageCell
// 这里重新写一个异步方法去加载图片
Task {
if let image = await PhotoAndVideoMananger.mananger.getImageByIdent(identifier: self.dataSource![indexPath.item].localIdentifier) {
cell.imageView.image = image
}
// // 这里重新写一个异步方法去加载图片
// Task {
// if let image = await PhotoAndVideoMananger.mananger.getImageByIdent(identifier: self.dataSource![indexPath.item].localIdentifier) {
// cell.imageView.image = image
// }
// }
// 最多25张使用同步
if let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: self.dataSource[indexPath.item].localIdentifier) {
cell.imageView.image = image
}
return cell
}
......@@ -299,7 +305,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
}
@objc func deleteMoreButtonSelect() {
let photosCount = (self.dataSource!.count > 25 ? 25 : self.dataSource?.count)!
let photosCount = self.dataSource.count > 25 ? 25 : self.dataSource.count
deleteButtonClickCallback(true,photosCount)
self.removeFromSuperview()
......
......@@ -56,25 +56,6 @@ class HomeInfoViewController:BaseViewController {
}
}
func showCommentPage(){
// 首先是免费三次机会用完之后,第四次点击广告,在结果页点击棒极了(删除成功,且loading页面消失)
if AdvManager.shared.currentTimes == 0 {
// 判断当天有没有被触发过
if let isCommentInCurrentDay = UserDefaults.standard.object(forKey: "showCommentInCurrentDay"){
let temp : Bool = isCommentInCurrentDay as! Bool
if !temp {
// 如果当天没有被显示过
CustomRate().show()
}else {
// 如果当天显示过了
UserDefaults.standard.set(true, forKey: "showCommentInCurrentDay")
}
}else{
CustomRate().show()
}
}
}
func deleteOp(imgs : [AssetModel],isAfterAdv:Bool){
var tempStringArray : [String] = []
......@@ -92,7 +73,7 @@ class HomeInfoViewController:BaseViewController {
PMLoadingHUD.share.disMiss()
// 结束之后是否弹出评价页面
SystemCommentManager.showCommentPage()
// 更新免费次数
if isAfterAdv == false {
......@@ -153,7 +134,8 @@ class HomeInfoViewController:BaseViewController {
if HomePayModel.share.isNoAd == false {
// 没有订阅
let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds)
view.dataSource = array as? [AssetModel]
view.dataSource = array as! [AssetModel]
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
......
......@@ -461,6 +461,9 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
@objc func deleteButtonAction(){
if selectedModel.count <= 0 {
return
}
// 首先看是否订阅
if HomePayModel.share.isNoAd == false {
......@@ -553,6 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
AdvManager.shared.showInterstitialAd(vc: self)
}
func deleteAction(count:Int,isAfterAdv:Bool){
// 删除当前选择
let tempArray = Array(self.selectedModel.prefix(count))
self.selectedModel = tempArray
......@@ -568,6 +572,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
print("删除文件成功")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
PMLoadingHUD.share.disMiss()
SystemCommentManager.showCommentPage()
if isAfterAdv == false {
self.updateFreeTimes()
}
......
......@@ -369,6 +369,10 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
@objc func deleteButtonAction(){
if selectedModel.count <= 0 {
return
}
// 首先看是否订阅
if HomePayModel.share.isNoAd == false {
// 没有订阅
......@@ -482,6 +486,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
PMLoadingHUD.share.disMiss()
print("删除文件成功")
// 如果是看广告删除的,且还有免费次数
SystemCommentManager.showCommentPage()
if isAfterAdv == false {
self.updateFreeTimes()
......
......@@ -238,27 +238,27 @@ class PhotoDataManager {
Print("处理截图结束")
})
}
// 相似视频
Print("正在处理相似视频")
PhotoAndVideoMananger.mananger.fetXSVideo { array in
PhotoSimilarityFinder.processSimilarVideoGroups(videoGroups: array) {ids in
var dataArray : [AssetModel] = []
for item in ids {
dataArray = dataArray + item
}
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in
// 不做处理
}, completion: { fileSize,index in
model6.assets = ids
model6.allFileSize = Double(fileSize)
PhotoDataManager.manager.saveToFileSystem(model: allModel)
let dataUpdated = Notification.Name("HomeSimilarVideoResourceUpdate")
NotificationCenter.default.post(name: dataUpdated, object: nil)
})
Print("处理相似视频结束")
}
}
// // 相似视频
// Print("正在处理相似视频")
// PhotoAndVideoMananger.mananger.fetXSVideo { array in
// PhotoSimilarityFinder.processSimilarVideoGroups(videoGroups: array) {ids in
//
// var dataArray : [AssetModel] = []
// for item in ids {
// dataArray = dataArray + item
// }
// PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in
// // 不做处理
// }, completion: { fileSize,index in
// model6.assets = ids
// model6.allFileSize = Double(fileSize)
// PhotoDataManager.manager.saveToFileSystem(model: allModel)
// let dataUpdated = Notification.Name("HomeSimilarVideoResourceUpdate")
// NotificationCenter.default.post(name: dataUpdated, object: nil)
// })
// Print("处理相似视频结束")
// }
// }
// 照片数据
PhotoAndVideoMananger.mananger.dealImageAssetData { data in
......@@ -358,7 +358,7 @@ class HomePhotosModel:Codable {
}
class AssetModel :Codable {
class AssetModel :Codable,Hashable {
var localIdentifier : String
var assetSize : Double
var createDate : Date
......@@ -367,6 +367,18 @@ class AssetModel :Codable {
self.assetSize = assetSize
self.createDate = createDate
}
func hash(into hasher: inout Hasher) {
hasher.combine(localIdentifier)
hasher.combine(assetSize)
hasher.combine(createDate)
}
static func ==(lhs: AssetModel, rhs: AssetModel) -> Bool {
return lhs.localIdentifier == rhs.localIdentifier &&
lhs.assetSize == rhs.assetSize &&
lhs.createDate == rhs.createDate
}
}
......
......@@ -26,7 +26,7 @@ class HomeOtherCollectionCell: UICollectionViewCell {
let iv = UIView()
iv.clipsToBounds = true
iv.layer.cornerRadius = 8
iv.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.2000)
iv.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
return iv
}()
......@@ -34,15 +34,15 @@ class HomeOtherCollectionCell: UICollectionViewCell {
public var countLabel: UILabel = {
let label = UILabel()
label.textColor = .white
label.font = .systemFont(ofSize: 10, weight: .medium)
label.font = .systemFont(ofSize: 14, weight: .medium)
label.textAlignment = .left
return label
}()
let sizeLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor(red: 0.6, green: 0.8, blue: 1, alpha: 1)
label.font = .systemFont(ofSize: 8, weight: .regular)
label.textColor = .white
label.font = .systemFont(ofSize: 10, weight: .medium)
label.textAlignment = .left
return label
}()
......@@ -201,7 +201,6 @@ class HomeOtherCollectionCell: UICollectionViewCell {
imageView.snp.makeConstraints { make in
make.top.equalTo(self.titleLabel.snp.bottom).offset(8)
// make.bottom.equalToSuperview().offset(-16)
make.left.equalToSuperview().offset(16)
make.width.equalToSuperview().offset(-32)
make.height.equalTo(self.width - 32)
......@@ -226,13 +225,11 @@ class HomeOtherCollectionCell: UICollectionViewCell {
self.countLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.top.equalToSuperview().offset(3)
make.width.equalTo(68)
make.height.equalTo(20)
}
self.sizeLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(12)
make.top.equalTo(countLabel.snp.bottom).offset(0)
make.width.equalTo(68)
make.top.equalTo(countLabel.snp.bottom).offset(-2)
make.height.equalTo(14)
}
self.moreImageView.snp.makeConstraints { make in
......
......@@ -26,7 +26,6 @@ class PMShowVideoCell: UICollectionViewCell {
}
if let url = url {
player.playVideo(from: url)
player.pause()
}
}
......
......@@ -100,7 +100,6 @@ class SecretSetViewController: BaseViewController, UITextFieldDelegate {
}
return
}
UserDefaults.standard.set("", forKey: SecretViewController.psKey)
let alert = UIAlertController(title: nil, message: "Unlocked", preferredStyle: .alert)
self.present(alert, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
......
......@@ -1042,68 +1042,136 @@ class PhotoAndVideoMananger {
}
// func groupSimilarImages(assets: [PHAsset], progressCompletion: @escaping ([[AssetModel]]) -> Void, completion: @escaping ([[AssetModel]]) -> Void) {
// print("开始处理相似图片")
// DispatchQueue.global().async {
// print("进入异步任务处理相似图片")
//
// var assetModels: [AssetModel] = []
// var hashes: [String: AssetModel] = [:]
// var groupedImages: [[AssetModel]] = []
// let dispatchGroup = DispatchGroup()
//
// for asset in assets {
// // 创建 AssetModel
// let createDate = asset.creationDate ?? Date()
// let model = AssetModel(localIdentifier: asset.localIdentifier, assetSize: self.findAssetSize(asset: asset), createDate: createDate)
// assetModels.append(model)
//
// // 请求图像
// dispatchGroup.enter()
// PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width: 32, height: 32), contentMode: .aspectFit, options: nil) { (image, _) in
// if let image = image {
// let hash = self.calculateImageHashUsingCoreImage(image)
// if !hash.isEmpty {
// hashes[hash] = model
// }
// }
// dispatchGroup.leave()
// }
// }
//
// // 等待所有请求完成后进行比较
// dispatchGroup.notify(queue: .global()) {
// print("获取到全部hash值")
//
// var usedHashes: Set<String> = []
// for (hash1, model1) in hashes {
// if usedHashes.contains(hash1) { continue }
// var similarModels: [AssetModel] = [model1]
// usedHashes.insert(hash1)
//
// for (hash2, model2) in hashes {
// if usedHashes.contains(hash2) { continue }
// let distance = self.hammingDistance(hash1, hash2)
// if distance < self.hashDistance { // 可以根据需求调整阈值
// similarModels.append(model2)
// usedHashes.insert(hash2)
// }
// }
//
// if similarModels.count >= 2 {
// groupedImages.append(similarModels)
// // 每次找到新的相似组,通过 progressCompletion 回调返回当前已处理好的分组数据
// print("判断相似", similarModels)
// DispatchQueue.main.async {
// progressCompletion(groupedImages)
// }
// }
// }
//
// DispatchQueue.main.async {
// completion(groupedImages)
// }
// }
// }
// }
func groupSimilarImages(assets: [PHAsset], progressCompletion: @escaping ([[AssetModel]]) -> Void, completion: @escaping ([[AssetModel]]) -> Void) {
print("开始处理相似图片")
DispatchQueue.global().async {
print("进入异步任务处理相似图片")
var assetModels: [AssetModel] = []
var hashes: [String: AssetModel] = [:]
var groupedImages: [[AssetModel]] = []
let dispatchGroup = DispatchGroup()
var hashes: [String: AssetModel] = [:]
let semaphore = DispatchSemaphore(value: 1)
var lastProgressUpdateTime = Date()
let progressUpdateInterval: TimeInterval = 1.0 // 每隔 1 秒更新一次 UI
for asset in assets {
// 创建 AssetModel
let createDate = asset.creationDate ?? Date()
let model = AssetModel(localIdentifier: asset.localIdentifier, assetSize: self.findAssetSize(asset: asset), createDate: createDate)
assetModels.append(model)
// 请求图像
dispatchGroup.enter()
PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width: 32, height: 32), contentMode: .aspectFit, options: nil) { (image, _) in
if let image = image {
let hash = self.calculateImageHashUsingCoreImage(image)
if !hash.isEmpty {
semaphore.wait()
hashes[hash] = model
var similarModels: [AssetModel] = [model]
var usedHashes: Set<String> = [hash]
for (existingHash, existingModel) in hashes {
if usedHashes.contains(existingHash) { continue }
let distance = self.hammingDistance(hash, existingHash)
if distance < self.hashDistance { // 可以根据需求调整阈值
similarModels.append(existingModel)
usedHashes.insert(existingHash)
}
}
if similarModels.count >= 2 {
var foundGroupIndex: Int? = nil
for (index, group) in groupedImages.enumerated() {
if !Set(group.map { $0.localIdentifier }).isDisjoint(with: Set(similarModels.map { $0.localIdentifier })) {
foundGroupIndex = index
break
}
}
if let index = foundGroupIndex {
groupedImages[index] = Array(Set(groupedImages[index] + similarModels))
} else {
groupedImages.append(similarModels)
}
// 控制 UI 刷新频率
let currentTime = Date()
if currentTime.timeIntervalSince(lastProgressUpdateTime) >= progressUpdateInterval {
lastProgressUpdateTime = currentTime
DispatchQueue.main.async {
progressCompletion(groupedImages)
}
}
}
semaphore.signal()
}
}
dispatchGroup.leave()
}
}
// 等待所有请求完成后进行比较
dispatchGroup.notify(queue: .global()) {
print("获取到全部hash值")
var usedHashes: Set<String> = []
for (hash1, model1) in hashes {
if usedHashes.contains(hash1) { continue }
var similarModels: [AssetModel] = [model1]
usedHashes.insert(hash1)
for (hash2, model2) in hashes {
if usedHashes.contains(hash2) { continue }
let distance = self.hammingDistance(hash1, hash2)
if distance < self.hashDistance { // 可以根据需求调整阈值
similarModels.append(model2)
usedHashes.insert(hash2)
}
}
if similarModels.count >= 2 {
groupedImages.append(similarModels)
// 每次找到新的相似组,通过 progressCompletion 回调返回当前已处理好的分组数据
print("判断相似", similarModels)
DispatchQueue.main.async {
progressCompletion(groupedImages)
}
}
}
DispatchQueue.main.async {
completion(groupedImages)
}
}
completion(groupedImages)
}
}
}
......
//
// SystemCommentManager.swift
// PhoneManager
//
// Created by edy on 2025/4/29.
//
import Foundation
class SystemCommentManager {
// 记录评价时间
private static let SHOW_COMMENT_DATE = "showCommentDate"
// 当天是否评价
private static let SHOW_COMMENT_IN_CURRENT_DAY = "showCommentInCurrentDay"
/// 弹窗评论
class func showCommentPage(){
if let date = UserDefaults.standard.object(forKey: SHOW_COMMENT_DATE){
// 如果是有时间,判断和当前时间是不是一致的,如果是一致
let calendar = Calendar.current
let isSameDay = calendar.isDate(date as! Date, inSameDayAs: Date())
if !isSameDay {
initCommentInfoInDisk()
}
}else{
initCommentInfoInDisk()
}
// 首先是免费三次机会用完之后,第四次点击广告,在结果页点击棒极了(删除成功,且loading页面消失)
if AdvManager.shared.defaultFreeTimes == 0 {
// 判断当天有没有被触发过
if let isCommentInCurrentDay = UserDefaults.standard.object(forKey: SHOW_COMMENT_IN_CURRENT_DAY){
let temp : Bool = isCommentInCurrentDay as! Bool
if !temp {
showAction()
}
}else{
showAction()
}
}
}
/// 显示评价弹窗操作
private class func showAction(){
DispatchQueue.main.async {
CustomRate().show()
}
UserDefaults.standard.set(true, forKey: SHOW_COMMENT_IN_CURRENT_DAY)
UserDefaults.standard.set(Date(), forKey: SHOW_COMMENT_DATE)
}
/// 初始化评价的基础信息
private class func initCommentInfoInDisk(){
UserDefaults.standard.set(false, forKey: SHOW_COMMENT_IN_CURRENT_DAY)
UserDefaults.standard.set(Date(), forKey: SHOW_COMMENT_DATE)
}
}
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