Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
P
PhoneManager
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yang
PhoneManager
Commits
6591ae36
Commit
6591ae36
authored
Apr 29, 2025
by
CZ1004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【优化】修复BUG
parent
46bd273a
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
238 additions
and
104 deletions
+238
-104
AdvTipDeleteView.swift
...r/Class/Session/Advertisement/View/AdvTipDeleteView.swift
+16
-10
HomeInfoViewController.swift
...lass/Session/Home/Controller/HomeInfoViewController.swift
+3
-21
HomePhotosDetailViewController.swift
...sion/Home/Controller/HomePhotosDetailViewController.swift
+5
-0
HomeVideoDetailController.swift
...s/Session/Home/Controller/HomeVideoDetailController.swift
+5
-0
HomePhotosModel .swift
...ager/Class/Session/Home/View/Model/HomePhotosModel .swift
+34
-22
HomeOtherCollectionCell.swift
...lass/Session/Home/View/cell/HomeOtherCollectionCell.swift
+5
-8
PMShowVideoCell.swift
PhoneManager/Class/Session/Secret/Cell/PMShowVideoCell.swift
+0
-1
SecretSetViewController.swift
...anager/Class/Session/Secret/SecretSetViewController.swift
+0
-1
PhotoAndVideoMananger.swift
...l/Class/PhotoAndVideoMananger/PhotoAndVideoMananger.swift
+109
-41
SystemCommentManager.swift
...ool/Class/SystemCommentManager/SystemCommentManager.swift
+61
-0
No files found.
PhoneManager/Class/Session/Advertisement/View/AdvTipDeleteView.swift
View file @
6591ae36
...
@@ -41,7 +41,7 @@ class AdvTipDeleteView : UIView {
...
@@ -41,7 +41,7 @@ class AdvTipDeleteView : UIView {
var
freeDeleteCount
:
Int
=
0
var
freeDeleteCount
:
Int
=
0
var
dataSource
:
[
AssetModel
]
?
var
dataSource
:
[
AssetModel
]
=
[]
var
tipDeleteModel
:
AdvTipModel
=
AdvTipModel
(
titleText
:
""
,
detailTitleText
:
""
,
showLessButton
:
false
,
deleteMoreText
:
""
,
deleteLessText
:
""
)
var
tipDeleteModel
:
AdvTipModel
=
AdvTipModel
(
titleText
:
""
,
detailTitleText
:
""
,
showLessButton
:
false
,
deleteMoreText
:
""
,
deleteLessText
:
""
)
...
@@ -198,8 +198,8 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
...
@@ -198,8 +198,8 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
func
getOtherInfoByType
(
type
:
PhotsFileType
)
{
func
getOtherInfoByType
(
type
:
PhotsFileType
)
{
// 首先获取第一个button显示的内容
// 首先获取第一个button显示的内容
let
photosCount
=
self
.
dataSource
!.
count
>
25
?
25
:
self
.
dataSource
?
.
count
let
photosCount
=
self
.
dataSource
.
count
>
25
?
25
:
self
.
dataSource
.
count
let
deleteButtonTitle
=
"Delete
\(
photosCount
??
0
)
\(
type
.
rawValue
)
"
let
deleteButtonTitle
=
"Delete
\(
photosCount
)
\(
type
.
rawValue
)
"
var
deleteLessText
=
""
var
deleteLessText
=
""
if
type
==
.
videos
||
type
==
.
SimilarVideos
{
if
type
==
.
videos
||
type
==
.
SimilarVideos
{
...
@@ -271,16 +271,22 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
...
@@ -271,16 +271,22 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
func
collectionView
(
_
collectionView
:
UICollectionView
,
numberOfItemsInSection
section
:
Int
)
->
Int
{
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
{
func
collectionView
(
_
collectionView
:
UICollectionView
,
cellForItemAt
indexPath
:
IndexPath
)
->
UICollectionViewCell
{
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
ImageCell
.
reuseIdentifier
,
for
:
indexPath
)
as!
ImageCell
let
cell
=
collectionView
.
dequeueReusableCell
(
withReuseIdentifier
:
ImageCell
.
reuseIdentifier
,
for
:
indexPath
)
as!
ImageCell
// 这里重新写一个异步方法去加载图片
// // 这里重新写一个异步方法去加载图片
Task
{
// Task {
if
let
image
=
await
PhotoAndVideoMananger
.
mananger
.
getImageByIdent
(
identifier
:
self
.
dataSource
!
[
indexPath
.
item
]
.
localIdentifier
)
{
// if let image = await PhotoAndVideoMananger.mananger.getImageByIdent(identifier: self.dataSource![indexPath.item].localIdentifier) {
cell
.
imageView
.
image
=
image
// cell.imageView.image = image
}
// }
// }
// 最多25张使用同步
if
let
image
=
PhotoAndVideoMananger
.
mananger
.
getImageFromAssetID
(
id
:
self
.
dataSource
[
indexPath
.
item
]
.
localIdentifier
)
{
cell
.
imageView
.
image
=
image
}
}
return
cell
return
cell
}
}
...
@@ -299,7 +305,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
...
@@ -299,7 +305,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
}
}
@objc
func
deleteMoreButtonSelect
()
{
@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
)
deleteButtonClickCallback
(
true
,
photosCount
)
self
.
removeFromSuperview
()
self
.
removeFromSuperview
()
...
...
PhoneManager/Class/Session/Home/Controller/HomeInfoViewController.swift
View file @
6591ae36
...
@@ -56,25 +56,6 @@ class HomeInfoViewController:BaseViewController {
...
@@ -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
){
func
deleteOp
(
imgs
:
[
AssetModel
],
isAfterAdv
:
Bool
){
var
tempStringArray
:
[
String
]
=
[]
var
tempStringArray
:
[
String
]
=
[]
...
@@ -92,7 +73,7 @@ class HomeInfoViewController:BaseViewController {
...
@@ -92,7 +73,7 @@ class HomeInfoViewController:BaseViewController {
PMLoadingHUD
.
share
.
disMiss
()
PMLoadingHUD
.
share
.
disMiss
()
// 结束之后是否弹出评价页面
// 结束之后是否弹出评价页面
SystemCommentManager
.
showCommentPage
()
// 更新免费次数
// 更新免费次数
if
isAfterAdv
==
false
{
if
isAfterAdv
==
false
{
...
@@ -153,7 +134,8 @@ class HomeInfoViewController:BaseViewController {
...
@@ -153,7 +134,8 @@ class HomeInfoViewController:BaseViewController {
if
HomePayModel
.
share
.
isNoAd
==
false
{
if
HomePayModel
.
share
.
isNoAd
==
false
{
// 没有订阅
// 没有订阅
let
view
:
AdvTipDeleteView
=
AdvTipDeleteView
(
frame
:
self
.
view
.
bounds
)
let
view
:
AdvTipDeleteView
=
AdvTipDeleteView
(
frame
:
self
.
view
.
bounds
)
view
.
dataSource
=
array
as?
[
AssetModel
]
view
.
dataSource
=
array
as!
[
AssetModel
]
// 获取当前免费次数
// 获取当前免费次数
let
freeCount
=
AdvManager
.
shared
.
defaultFreeTimes
let
freeCount
=
AdvManager
.
shared
.
defaultFreeTimes
...
...
PhoneManager/Class/Session/Home/Controller/HomePhotosDetailViewController.swift
View file @
6591ae36
...
@@ -461,6 +461,9 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
...
@@ -461,6 +461,9 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
@objc
func
deleteButtonAction
(){
@objc
func
deleteButtonAction
(){
if
selectedModel
.
count
<=
0
{
return
}
// 首先看是否订阅
// 首先看是否订阅
if
HomePayModel
.
share
.
isNoAd
==
false
{
if
HomePayModel
.
share
.
isNoAd
==
false
{
...
@@ -553,6 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
...
@@ -553,6 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
)
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
)
}
}
func
deleteAction
(
count
:
Int
,
isAfterAdv
:
Bool
){
func
deleteAction
(
count
:
Int
,
isAfterAdv
:
Bool
){
// 删除当前选择
// 删除当前选择
let
tempArray
=
Array
(
self
.
selectedModel
.
prefix
(
count
))
let
tempArray
=
Array
(
self
.
selectedModel
.
prefix
(
count
))
self
.
selectedModel
=
tempArray
self
.
selectedModel
=
tempArray
...
@@ -568,6 +572,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
...
@@ -568,6 +572,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
print
(
"删除文件成功"
)
print
(
"删除文件成功"
)
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1.0
)
{
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1.0
)
{
PMLoadingHUD
.
share
.
disMiss
()
PMLoadingHUD
.
share
.
disMiss
()
SystemCommentManager
.
showCommentPage
()
if
isAfterAdv
==
false
{
if
isAfterAdv
==
false
{
self
.
updateFreeTimes
()
self
.
updateFreeTimes
()
}
}
...
...
PhoneManager/Class/Session/Home/Controller/HomeVideoDetailController.swift
View file @
6591ae36
...
@@ -369,6 +369,10 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
...
@@ -369,6 +369,10 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
@objc
func
deleteButtonAction
(){
@objc
func
deleteButtonAction
(){
if
selectedModel
.
count
<=
0
{
return
}
// 首先看是否订阅
// 首先看是否订阅
if
HomePayModel
.
share
.
isNoAd
==
false
{
if
HomePayModel
.
share
.
isNoAd
==
false
{
// 没有订阅
// 没有订阅
...
@@ -482,6 +486,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
...
@@ -482,6 +486,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
PMLoadingHUD
.
share
.
disMiss
()
PMLoadingHUD
.
share
.
disMiss
()
print
(
"删除文件成功"
)
print
(
"删除文件成功"
)
// 如果是看广告删除的,且还有免费次数
// 如果是看广告删除的,且还有免费次数
SystemCommentManager
.
showCommentPage
()
if
isAfterAdv
==
false
{
if
isAfterAdv
==
false
{
self
.
updateFreeTimes
()
self
.
updateFreeTimes
()
...
...
PhoneManager/Class/Session/Home/View/Model/HomePhotosModel .swift
View file @
6591ae36
...
@@ -238,27 +238,27 @@ class PhotoDataManager {
...
@@ -238,27 +238,27 @@ class PhotoDataManager {
Print
(
"处理截图结束"
)
Print
(
"处理截图结束"
)
})
})
}
}
// 相似视频
//
// 相似视频
Print
(
"正在处理相似视频"
)
//
Print("正在处理相似视频")
PhotoAndVideoMananger
.
mananger
.
fetXSVideo
{
array
in
//
PhotoAndVideoMananger.mananger.fetXSVideo { array in
PhotoSimilarityFinder
.
processSimilarVideoGroups
(
videoGroups
:
array
)
{
ids
in
//
PhotoSimilarityFinder.processSimilarVideoGroups(videoGroups: array) {ids in
//
var
dataArray
:
[
AssetModel
]
=
[]
//
var dataArray : [AssetModel] = []
for
item
in
ids
{
//
for item in ids {
dataArray
=
dataArray
+
item
//
dataArray = dataArray + item
}
//
}
PhotoAndVideoMananger
.
mananger
.
calculateTotalSize
(
of
:
PhotoAndVideoMananger
.
mananger
.
getPHAsssetwithIDs
(
ids
:
dataArray
)
!
,
progress
:
{
fileSiez
,
index
in
//
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in
// 不做处理
//
// 不做处理
},
completion
:
{
fileSize
,
index
in
//
}, completion: { fileSize,index in
model6
.
assets
=
ids
//
model6.assets = ids
model6
.
allFileSize
=
Double
(
fileSize
)
//
model6.allFileSize = Double(fileSize)
PhotoDataManager
.
manager
.
saveToFileSystem
(
model
:
allModel
)
//
PhotoDataManager.manager.saveToFileSystem(model: allModel)
let
dataUpdated
=
Notification
.
Name
(
"HomeSimilarVideoResourceUpdate"
)
//
let dataUpdated = Notification.Name("HomeSimilarVideoResourceUpdate")
NotificationCenter
.
default
.
post
(
name
:
dataUpdated
,
object
:
nil
)
//
NotificationCenter.default.post(name: dataUpdated, object: nil)
})
//
})
Print
(
"处理相似视频结束"
)
//
Print("处理相似视频结束")
}
//
}
}
//
}
// 照片数据
// 照片数据
PhotoAndVideoMananger
.
mananger
.
dealImageAssetData
{
data
in
PhotoAndVideoMananger
.
mananger
.
dealImageAssetData
{
data
in
...
@@ -358,7 +358,7 @@ class HomePhotosModel:Codable {
...
@@ -358,7 +358,7 @@ class HomePhotosModel:Codable {
}
}
class
AssetModel
:
Codable
{
class
AssetModel
:
Codable
,
Hashable
{
var
localIdentifier
:
String
var
localIdentifier
:
String
var
assetSize
:
Double
var
assetSize
:
Double
var
createDate
:
Date
var
createDate
:
Date
...
@@ -367,6 +367,18 @@ class AssetModel :Codable {
...
@@ -367,6 +367,18 @@ class AssetModel :Codable {
self
.
assetSize
=
assetSize
self
.
assetSize
=
assetSize
self
.
createDate
=
createDate
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
}
}
}
...
...
PhoneManager/Class/Session/Home/View/cell/HomeOtherCollectionCell.swift
View file @
6591ae36
...
@@ -26,7 +26,7 @@ class HomeOtherCollectionCell: UICollectionViewCell {
...
@@ -26,7 +26,7 @@ class HomeOtherCollectionCell: UICollectionViewCell {
let
iv
=
UIView
()
let
iv
=
UIView
()
iv
.
clipsToBounds
=
true
iv
.
clipsToBounds
=
true
iv
.
layer
.
cornerRadius
=
8
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
return
iv
}()
}()
...
@@ -34,15 +34,15 @@ class HomeOtherCollectionCell: UICollectionViewCell {
...
@@ -34,15 +34,15 @@ class HomeOtherCollectionCell: UICollectionViewCell {
public
var
countLabel
:
UILabel
=
{
public
var
countLabel
:
UILabel
=
{
let
label
=
UILabel
()
let
label
=
UILabel
()
label
.
textColor
=
.
white
label
.
textColor
=
.
white
label
.
font
=
.
systemFont
(
ofSize
:
1
0
,
weight
:
.
medium
)
label
.
font
=
.
systemFont
(
ofSize
:
1
4
,
weight
:
.
medium
)
label
.
textAlignment
=
.
left
label
.
textAlignment
=
.
left
return
label
return
label
}()
}()
let
sizeLabel
:
UILabel
=
{
let
sizeLabel
:
UILabel
=
{
let
label
=
UILabel
()
let
label
=
UILabel
()
label
.
textColor
=
UIColor
(
red
:
0.6
,
green
:
0.8
,
blue
:
1
,
alpha
:
1
)
label
.
textColor
=
.
white
label
.
font
=
.
systemFont
(
ofSize
:
8
,
weight
:
.
regular
)
label
.
font
=
.
systemFont
(
ofSize
:
10
,
weight
:
.
medium
)
label
.
textAlignment
=
.
left
label
.
textAlignment
=
.
left
return
label
return
label
}()
}()
...
@@ -201,7 +201,6 @@ class HomeOtherCollectionCell: UICollectionViewCell {
...
@@ -201,7 +201,6 @@ class HomeOtherCollectionCell: UICollectionViewCell {
imageView
.
snp
.
makeConstraints
{
make
in
imageView
.
snp
.
makeConstraints
{
make
in
make
.
top
.
equalTo
(
self
.
titleLabel
.
snp
.
bottom
)
.
offset
(
8
)
make
.
top
.
equalTo
(
self
.
titleLabel
.
snp
.
bottom
)
.
offset
(
8
)
// make.bottom.equalToSuperview().offset(-16)
make
.
left
.
equalToSuperview
()
.
offset
(
16
)
make
.
left
.
equalToSuperview
()
.
offset
(
16
)
make
.
width
.
equalToSuperview
()
.
offset
(
-
32
)
make
.
width
.
equalToSuperview
()
.
offset
(
-
32
)
make
.
height
.
equalTo
(
self
.
width
-
32
)
make
.
height
.
equalTo
(
self
.
width
-
32
)
...
@@ -226,13 +225,11 @@ class HomeOtherCollectionCell: UICollectionViewCell {
...
@@ -226,13 +225,11 @@ class HomeOtherCollectionCell: UICollectionViewCell {
self
.
countLabel
.
snp
.
makeConstraints
{
make
in
self
.
countLabel
.
snp
.
makeConstraints
{
make
in
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
top
.
equalToSuperview
()
.
offset
(
3
)
make
.
top
.
equalToSuperview
()
.
offset
(
3
)
make
.
width
.
equalTo
(
68
)
make
.
height
.
equalTo
(
20
)
make
.
height
.
equalTo
(
20
)
}
}
self
.
sizeLabel
.
snp
.
makeConstraints
{
make
in
self
.
sizeLabel
.
snp
.
makeConstraints
{
make
in
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
left
.
equalToSuperview
()
.
offset
(
12
)
make
.
top
.
equalTo
(
countLabel
.
snp
.
bottom
)
.
offset
(
0
)
make
.
top
.
equalTo
(
countLabel
.
snp
.
bottom
)
.
offset
(
-
2
)
make
.
width
.
equalTo
(
68
)
make
.
height
.
equalTo
(
14
)
make
.
height
.
equalTo
(
14
)
}
}
self
.
moreImageView
.
snp
.
makeConstraints
{
make
in
self
.
moreImageView
.
snp
.
makeConstraints
{
make
in
...
...
PhoneManager/Class/Session/Secret/Cell/PMShowVideoCell.swift
View file @
6591ae36
...
@@ -26,7 +26,6 @@ class PMShowVideoCell: UICollectionViewCell {
...
@@ -26,7 +26,6 @@ class PMShowVideoCell: UICollectionViewCell {
}
}
if
let
url
=
url
{
if
let
url
=
url
{
player
.
playVideo
(
from
:
url
)
player
.
playVideo
(
from
:
url
)
player
.
pause
()
}
}
}
}
...
...
PhoneManager/Class/Session/Secret/SecretSetViewController.swift
View file @
6591ae36
...
@@ -100,7 +100,6 @@ class SecretSetViewController: BaseViewController, UITextFieldDelegate {
...
@@ -100,7 +100,6 @@ class SecretSetViewController: BaseViewController, UITextFieldDelegate {
}
}
return
return
}
}
UserDefaults
.
standard
.
set
(
""
,
forKey
:
SecretViewController
.
psKey
)
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"Unlocked"
,
preferredStyle
:
.
alert
)
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"Unlocked"
,
preferredStyle
:
.
alert
)
self
.
present
(
alert
,
animated
:
true
)
self
.
present
(
alert
,
animated
:
true
)
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1.5
)
{
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1.5
)
{
...
...
PhoneManager/Class/Tool/Class/PhotoAndVideoMananger/PhotoAndVideoMananger.swift
View file @
6591ae36
...
@@ -1042,68 +1042,136 @@ class PhotoAndVideoMananger {
...
@@ -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
)
{
func
groupSimilarImages
(
assets
:
[
PHAsset
],
progressCompletion
:
@escaping
([[
AssetModel
]])
->
Void
,
completion
:
@escaping
([[
AssetModel
]])
->
Void
)
{
print
(
"开始处理相似图片"
)
print
(
"开始处理相似图片"
)
DispatchQueue
.
global
()
.
async
{
DispatchQueue
.
global
()
.
async
{
print
(
"进入异步任务处理相似图片"
)
print
(
"进入异步任务处理相似图片"
)
var
assetModels
:
[
AssetModel
]
=
[]
var
hashes
:
[
String
:
AssetModel
]
=
[:]
var
groupedImages
:
[[
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
{
for
asset
in
assets
{
// 创建 AssetModel
// 创建 AssetModel
let
createDate
=
asset
.
creationDate
??
Date
()
let
createDate
=
asset
.
creationDate
??
Date
()
let
model
=
AssetModel
(
localIdentifier
:
asset
.
localIdentifier
,
assetSize
:
self
.
findAssetSize
(
asset
:
asset
),
createDate
:
createDate
)
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
PHImageManager
.
default
()
.
requestImage
(
for
:
asset
,
targetSize
:
CGSize
(
width
:
32
,
height
:
32
),
contentMode
:
.
aspectFit
,
options
:
nil
)
{
(
image
,
_
)
in
if
let
image
=
image
{
if
let
image
=
image
{
let
hash
=
self
.
calculateImageHashUsingCoreImage
(
image
)
let
hash
=
self
.
calculateImageHashUsingCoreImage
(
image
)
if
!
hash
.
isEmpty
{
if
!
hash
.
isEmpty
{
semaphore
.
wait
()
hashes
[
hash
]
=
model
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
)
}
}
}
}
}
}
...
...
PhoneManager/Class/Tool/Class/SystemCommentManager/SystemCommentManager.swift
0 → 100644
View file @
6591ae36
//
// 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
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment