Commit 71bca841 authored by CZ1004's avatar CZ1004

修改数据源结构方式

parent 7ab40d47
...@@ -89,11 +89,11 @@ class HomeInfoViewController:BaseViewController { ...@@ -89,11 +89,11 @@ class HomeInfoViewController:BaseViewController {
return sview return sview
}() }()
var ids: [[String]]? var ids: [[AssetModel]]?
var titleText : String? var titleText : String?
init(ids: [[String]],type:PhotsFileType?,titleText:String) { init(ids: [[AssetModel]],type:PhotsFileType?,titleText:String) {
self.ids = ids self.ids = ids
self.type = type self.type = type
self.titleText = titleText self.titleText = titleText
......
...@@ -29,10 +29,10 @@ class HomePhotosDetailViewController : BaseViewController { ...@@ -29,10 +29,10 @@ class HomePhotosDetailViewController : BaseViewController {
private var videoDetailNavView:VideoDetaiNavView? private var videoDetailNavView:VideoDetaiNavView?
var resourceData : [String] = [] var resourceData : [AssetModel] = []
func dealData(){ func dealData(){
var dataArray : [String] = [] var dataArray : [AssetModel] = []
for item in self.model.assets { for item in self.model.assets {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -52,7 +52,7 @@ class HomePhotosDetailViewController : BaseViewController { ...@@ -52,7 +52,7 @@ class HomePhotosDetailViewController : BaseViewController {
} }
// 当前页面选中的 // 当前页面选中的
var selectedModel : [String] = [] { var selectedModel : [AssetModel] = [] {
didSet{ didSet{
if self.selectedModel.count == 0{ if self.selectedModel.count == 0{
self.deleteButton.setTitle("Delete", for: .normal) self.deleteButton.setTitle("Delete", for: .normal)
...@@ -86,12 +86,6 @@ class HomePhotosDetailViewController : BaseViewController { ...@@ -86,12 +86,6 @@ class HomePhotosDetailViewController : BaseViewController {
}() }()
// lazy var emptyTrashView : EmptyTrashView = {
// let view = EmptyTrashView()
// view.backgroundColor = .white
// return view
// }()
lazy var deleteButton : UIButton = { lazy var deleteButton : UIButton = {
let view = UIButton() let view = UIButton()
view.setTitle("Delete", for: UIControl.State.normal) view.setTitle("Delete", for: UIControl.State.normal)
...@@ -137,12 +131,6 @@ class HomePhotosDetailViewController : BaseViewController { ...@@ -137,12 +131,6 @@ class HomePhotosDetailViewController : BaseViewController {
} }
// self.view.addSubview(self.emptyTrashView)
// self.emptyTrashView.snp.makeConstraints { make in
// make.left.right.equalToSuperview()
// make.bottom.equalToSuperview().offset(-34)
// make.height.equalTo(70)
// }
self.view.insertSubview(collectionView, at: 0) self.view.insertSubview(collectionView, at: 0)
self.view.addSubview(self.deleteButton) self.view.addSubview(self.deleteButton)
...@@ -195,7 +183,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -195,7 +183,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
cell.resourceIdent = self.resourceData[indexPath.row] cell.resourceIdent = self.resourceData[indexPath.row]
cell.currentOrder = indexPath.row cell.currentOrder = indexPath.row
if self.selectedModel.contains(cell.resourceIdent) { if self.selectedModel.contains(where: { $0.localIdentifier == cell.resourceIdent.localIdentifier }) {
cell.choose = true cell.choose = true
}else{ }else{
cell.choose = false cell.choose = false
...@@ -214,7 +202,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -214,7 +202,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
dataSource.isSeleted = true dataSource.isSeleted = true
dataSource.id = ident dataSource.id = ident
// 获取image // 获取image
dataSource.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: ident) dataSource.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: ident.localIdentifier)
vc.homeDataSource = [dataSource] vc.homeDataSource = [dataSource]
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
...@@ -225,7 +213,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -225,7 +213,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
if click == true { if click == true {
self.selectedModel.append(self.resourceData[order]) self.selectedModel.append(self.resourceData[order])
}else{ }else{
self.selectedModel.removeAll { $0 == self.resourceData[order] } self.selectedModel.removeAll { $0.localIdentifier == self.resourceData[order].localIdentifier }
} }
DispatchQueue.main.async { DispatchQueue.main.async {
if self.selectedModel.count > 0 { if self.selectedModel.count > 0 {
...@@ -338,54 +326,21 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -338,54 +326,21 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
/// 对当前页面资源排序(注意这里获取的资源是image) /// 对当前页面资源排序(注意这里获取的资源是image)
/// - Parameter sortType: 排序类型 /// - Parameter sortType: 排序类型
func sortByType(sortType:Int){ func sortByType(sortType:Int){
// 实际就是对Video数据排序 switch sortType {
var assetsWithSize: [(asset: PHAsset, size: Int64)] = [] case 0:
let allImagesResult = PHAsset.fetchAssets(withLocalIdentifiers: self.resourceData, options: nil) self.resourceData = self.resourceData.sorted { $0.assetSize > $1.assetSize }
let allImages = allImagesResult.objects(at: IndexSet(0..<allImagesResult.count)) break
for item in allImages { case 1:
let resources = PHAssetResource.assetResources(for: item) self.resourceData = self.resourceData.sorted { $0.assetSize < $1.assetSize }
for resource in resources { break
if let fileSize = resource.value(forKey: "fileSize") as? Int64 { case 2:
assetsWithSize.append((item, fileSize)) self.resourceData = self.resourceData.sorted { $0.createDate > $1.createDate }
} break
} case 3:
} self.resourceData = self.resourceData.sorted { $0.createDate < $1.createDate }
if sortType == 0 || sortType == 1 { break
if sortType == 0 { default:
assetsWithSize = assetsWithSize.sorted { $0.size < $1.size } break
}else{
assetsWithSize = assetsWithSize.sorted { $0.size > $1.size }
}
// 输出排序后的资源信息
var sources:[String] = []
for (_, item) in assetsWithSize.enumerated() {
sources.append(item.asset.localIdentifier)
}
self.resourceData = sources
}
if sortType == 2 || sortType == 3 {
var assetsWithDate: [(asset: PHAsset, size: Int64)] = []
if sortType == 2 {
assetsWithDate = assetsWithSize.sorted {
guard let date1 = $0.asset.creationDate, let date2 = $1.asset.creationDate else {
return false
}
return date1 > date2
}
}else{
assetsWithDate = assetsWithSize.sorted {
guard let date1 = $0.asset.creationDate, let date2 = $1.asset.creationDate else {
return false
}
return date1 < date2
}
}
var sources:[String] = []
for item in assetsWithDate {
sources.append(item.asset.localIdentifier)
}
self.resourceData = sources
} }
} }
...@@ -393,7 +348,8 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -393,7 +348,8 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
@objc func deleteButtonAction(){ @objc func deleteButtonAction(){
// 删除当前选择 // 删除当前选择
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: self.selectedModel, options: nil) let allIdent = self.selectedModel.map{ $0.localIdentifier }
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: allIdent, options: nil)
PHPhotoLibrary.shared().performChanges ({ PHPhotoLibrary.shared().performChanges ({
PHAssetChangeRequest.deleteAssets(fetchResult as NSFastEnumeration) PHAssetChangeRequest.deleteAssets(fetchResult as NSFastEnumeration)
}){ success, error in }){ success, error in
...@@ -401,7 +357,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -401,7 +357,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
print("删除文件成功") print("删除文件成功")
// 移除当前总数据源的数据 // 移除当前总数据源的数据
for item in self.selectedModel { for item in self.selectedModel {
self.resourceData.removeAll{ $0 == item } self.resourceData.removeAll{ $0.localIdentifier == item.localIdentifier }
} }
}else { }else {
if let error = error { if let error = error {
......
...@@ -25,10 +25,10 @@ class HomeVideoDetailController :BaseViewController { ...@@ -25,10 +25,10 @@ class HomeVideoDetailController :BaseViewController {
private var videoDetailNavView:VideoDetaiNavView? private var videoDetailNavView:VideoDetaiNavView?
var resourceData : [String] = [] var resourceData : [AssetModel] = []
func dealData(){ func dealData(){
var dataArray : [String] = [] var dataArray : [AssetModel] = []
for item in self.model.assets { for item in self.model.assets {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -46,7 +46,7 @@ class HomeVideoDetailController :BaseViewController { ...@@ -46,7 +46,7 @@ class HomeVideoDetailController :BaseViewController {
} }
// 当前页面选中的 // 当前页面选中的
var selectedModel : [String] = [] { var selectedModel : [AssetModel] = [] {
didSet{ didSet{
DispatchQueue.main.async { [self] in DispatchQueue.main.async { [self] in
if self.selectedModel.count == 0 { if self.selectedModel.count == 0 {
...@@ -182,7 +182,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -182,7 +182,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
cell.resourceIdent = self.resourceData[indexPath.row] cell.resourceIdent = self.resourceData[indexPath.row]
cell.currentOrder = indexPath.row cell.currentOrder = indexPath.row
if self.selectedModel.contains(cell.resourceIdent) { if self.selectedModel.contains(where: { $0.localIdentifier == cell.resourceIdent!.localIdentifier }) {
cell.choose = true cell.choose = true
}else{ }else{
cell.choose = false cell.choose = false
...@@ -193,7 +193,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -193,7 +193,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
if click == true { if click == true {
self.selectedModel.append(self.resourceData[order]) self.selectedModel.append(self.resourceData[order])
}else{ }else{
self.selectedModel.removeAll { $0 == self.resourceData[order] } self.selectedModel.removeAll { $0.localIdentifier == self.resourceData[order].localIdentifier }
} }
DispatchQueue.main.async { DispatchQueue.main.async {
if self.selectedModel.count > 0 { if self.selectedModel.count > 0 {
...@@ -220,7 +220,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -220,7 +220,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
dataSource.image = image dataSource.image = image
// 表示这个是视频 // 表示这个是视频
vc.homeDataSource = [dataSource] vc.homeDataSource = [dataSource]
vc.getVideoURLFromLocalIdentifier(localIdentifier: ident) { url, error in vc.getVideoURLFromLocalIdentifier(localIdentifier: ident.localIdentifier) { url, error in
if url != nil{ if url != nil{
DispatchQueue.main.async { DispatchQueue.main.async {
...@@ -322,7 +322,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -322,7 +322,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
@objc func deleteButtonAction(){ @objc func deleteButtonAction(){
// 删除当前选择 // 删除当前选择
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: self.selectedModel, options: nil) let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: self.selectedModel.map{$0.localIdentifier}, options: nil)
PHPhotoLibrary.shared().performChanges ({ PHPhotoLibrary.shared().performChanges ({
PHAssetChangeRequest.deleteAssets(fetchResult as NSFastEnumeration) PHAssetChangeRequest.deleteAssets(fetchResult as NSFastEnumeration)
}){ success, error in }){ success, error in
...@@ -330,7 +330,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -330,7 +330,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
print("删除文件成功") print("删除文件成功")
// 移除当前总数据源的数据 // 移除当前总数据源的数据
for item in self.selectedModel { for item in self.selectedModel {
self.resourceData.removeAll{ $0 == item } self.resourceData.removeAll{ $0.localIdentifier == item.localIdentifier }
} }
}else { }else {
if let error = error { if let error = error {
...@@ -384,55 +384,21 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -384,55 +384,21 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
} }
func sortByType(sortType:Int){ func sortByType(sortType:Int){
switch sortType {
// 实际就是对Video数据排序 case 0:
var assetsWithSize: [(asset: PHAsset, size: Int64)] = [] self.resourceData = self.resourceData.sorted { $0.assetSize > $1.assetSize }
let allVideos = PHAsset.fetchAssets(withLocalIdentifiers: self.resourceData, options: nil) break
allVideos.enumerateObjects { (asset, index, stop) in case 1:
let resources = PHAssetResource.assetResources(for: asset) self.resourceData = self.resourceData.sorted { $0.assetSize < $1.assetSize }
for resource in resources { break
if let fileSize = resource.value(forKey: "fileSize") as? Int64 { case 2:
assetsWithSize.append((asset, fileSize)) self.resourceData = self.resourceData.sorted { $0.createDate > $1.createDate }
} break
} case 3:
} self.resourceData = self.resourceData.sorted { $0.createDate < $1.createDate }
if sortType == 0 || sortType == 1 { break
if sortType == 0 { default:
assetsWithSize = assetsWithSize.sorted { $0.size < $1.size } break
}else{
assetsWithSize = assetsWithSize.sorted { $0.size > $1.size }
}
// 输出排序后的资源信息
var sources:[String] = []
for (_, item) in assetsWithSize.enumerated() {
sources.append(item.asset.localIdentifier)
}
self.resourceData = sources
}
if sortType == 2 || sortType == 3 {
var assetsWithDate: [(asset: PHAsset, size: Int64)] = []
if sortType == 2 {
assetsWithDate = assetsWithSize.sorted {
guard let date1 = $0.asset.creationDate, let date2 = $1.asset.creationDate else {
return false
}
return date1 > date2
}
}else{
assetsWithDate = assetsWithSize.sorted {
guard let date1 = $0.asset.creationDate, let date2 = $1.asset.creationDate else {
return false
}
return date1 < date2
}
}
var sources:[String] = []
for item in assetsWithDate {
sources.append(item.asset.localIdentifier)
}
self.resourceData = sources
} }
} }
......
...@@ -9,7 +9,7 @@ import UIKit ...@@ -9,7 +9,7 @@ import UIKit
class HomeInfoView :UIView{ class HomeInfoView :UIView{
var ids:[[String]]? var ids:[[AssetModel]]?
var titleText : String? var titleText : String?
...@@ -72,7 +72,7 @@ class HomeInfoView :UIView{ ...@@ -72,7 +72,7 @@ class HomeInfoView :UIView{
return sview return sview
}() }()
init(frame: CGRect,ids:[[String]]?,type:PhotsFileType?,titleText:String?) { init(frame: CGRect,ids:[[AssetModel]]?,type:PhotsFileType?,titleText:String?) {
self.ids = ids self.ids = ids
self.titleText = titleText self.titleText = titleText
...@@ -164,9 +164,9 @@ class HomeInfoView :UIView{ ...@@ -164,9 +164,9 @@ class HomeInfoView :UIView{
setTitleView() setTitleView()
} }
func getSelectedArray() -> [String] { func getSelectedArray() -> [AssetModel] {
var selectedArray:[String] = [] var selectedArray:[AssetModel] = []
for smodel in models { for smodel in models {
...@@ -174,7 +174,7 @@ class HomeInfoView :UIView{ ...@@ -174,7 +174,7 @@ class HomeInfoView :UIView{
if smodel2.isSeleted ?? false { if smodel2.isSeleted ?? false {
selectedArray.append(smodel2.id) selectedArray.append(smodel2.id!)
} }
} }
} }
......
...@@ -53,6 +53,7 @@ class PhotoDataManager { ...@@ -53,6 +53,7 @@ class PhotoDataManager {
resultModel(model) resultModel(model)
} }
} }
private func loadDataFromPhotos(resultModel:@escaping (_ model:PhotosManagerModel) -> () = {mdoel in}) { private func loadDataFromPhotos(resultModel:@escaping (_ model:PhotosManagerModel) -> () = {mdoel in}) {
...@@ -75,54 +76,62 @@ class PhotoDataManager { ...@@ -75,54 +76,62 @@ class PhotoDataManager {
let allModel:PhotosManagerModel = PhotosManagerModel(allFileNumber: 0, allFileSize: 0, titleModelArray: [model1,model2], otherModelArray: [model3,model4,model5,model6,model7]) let allModel:PhotosManagerModel = PhotosManagerModel(allFileNumber: 0, allFileSize: 0, titleModelArray: [model1,model2], otherModelArray: [model3,model4,model5,model6,model7])
resultModel(allModel) resultModel(allModel)
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global().async {
// 重复照片
semaphore.wait()
Print("正在处理重复图片") Print("正在处理重复图片")
PhotoAndVideoMananger.mananger.dealSimilarPhotos(assets: PhotoAndVideoMananger.mananger.allAssets, threshold: 0.99) { data in PhotoAndVideoMananger.mananger.dealSimilarPhotos(assets: PhotoAndVideoMananger.mananger.allAssets, threshold: 0.99) { data1,data2 in
var dataArray : [String] = [] var dataArray1 : [AssetModel] = []
for item in data { var dataArray2 : [AssetModel] = []
dataArray = dataArray + item for item in data1 {
dataArray1 = dataArray1 + item
} }
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in for item in data2 {
dataArray2 = dataArray2 + item
}
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray1)!,progress: { fileSiez, index in
// 不做处理 // 不做处理
}, completion: { fileSize,index in }, completion: { fileSize,index in
model1.assets = data model1.assets = data1
model1.allFileSize = Double(fileSize) model1.allFileSize = Double(fileSize)
resultModel(allModel) resultModel(allModel)
Print("处理重复图片结束")
}) })
semaphore.signal() PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray2)!,progress: { fileSize, index in
}
// 相似照片
semaphore.wait()
Print("正在处理相似照片")
PhotoAndVideoMananger.mananger.dealSimilarPhotos(assets: PhotoAndVideoMananger.mananger.allAssets, threshold: 0.85) { data in
var dataArray : [String] = []
for item in data {
dataArray = dataArray + item
}
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in
// 不做处理 // 不做处理
}, completion: { fileSize,index in }, completion: { fileSize,index in
model2.assets = data model2.assets = data2
model2.allFileSize = Double(fileSize) model2.allFileSize = Double(fileSize)
resultModel(allModel) resultModel(allModel)
Print("处理相似图片结束") })
} completionHandler: { data1, data2 in
var dataArray1 : [AssetModel] = []
var dataArray2 : [AssetModel] = []
for item in data1 {
dataArray1 = dataArray1 + item
}
for item in data2 {
dataArray2 = dataArray2 + item
}
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray1)!,progress: { fileSiez, index in
// 不做处理
}, completion: { fileSize,index in
model1.assets = data1
model1.allFileSize = Double(fileSize)
resultModel(allModel)
}) })
semaphore.signal() PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray1)!,progress: { fileSize, index in
// 不做处理
}, completion: { fileSize,index in
model2.assets = data2
model2.allFileSize = Double(fileSize)
resultModel(allModel)
})
Print("处理重复图片结束")
} }
// 视频数据 // 视频数据
semaphore.wait()
Print("正在处理视频") Print("正在处理视频")
PhotoAndVideoMananger.mananger.dealVideoData { data in PhotoAndVideoMananger.mananger.dealVideoData { data in
var dataArray : [String] = [] var dataArray : [AssetModel] = []
for item in data { for item in data {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -134,33 +143,42 @@ class PhotoDataManager { ...@@ -134,33 +143,42 @@ class PhotoDataManager {
resultModel(allModel) resultModel(allModel)
Print("处理视频结束") Print("处理视频结束")
}) })
semaphore.signal()
} }
// 相似截图 // 相似截图
semaphore.wait()
Print("正在处理相似截图") Print("正在处理相似截图")
PhotoAndVideoMananger.mananger.dealSimilarPhotos(assets: PhotoAndVideoMananger.mananger.screenShotAssets, threshold: 0.85) { data in PhotoAndVideoMananger.mananger.dealSimilarPhotos(assets: PhotoAndVideoMananger.mananger.screenShotAssets, threshold: 0.99) { data1,data2 in
var dataArray : [String] = [] var dataArray1 : [AssetModel] = []
for item in data { for item in data1 {
dataArray = dataArray + item dataArray1 = dataArray1 + item
} }
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray)!,progress: { fileSiez, index in PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray1)!,progress: { fileSiez, index in
// 不做处理 // 不做处理
}, completion: { fileSize,index in }, completion: { fileSize,index in
model4.assets = data model4.assets = data1
model4.allFileSize = Double(fileSize) model4.allFileSize = Double(fileSize)
resultModel(allModel) resultModel(allModel)
Print("处理相似截图结束")
}) })
semaphore.signal() } completionHandler: { data1, data2 in
var dataArray1 : [AssetModel] = []
for item in data1 {
dataArray1 = dataArray1 + item
} }
PhotoAndVideoMananger.mananger.calculateTotalSize(of: PhotoAndVideoMananger.mananger.getPHAsssetwithIDs(ids: dataArray1)!,progress: { fileSiez, index in
// 不做处理
}, completion: { fileSize,index in
model4.assets = data1
model4.allFileSize = Double(fileSize)
resultModel(allModel)
})
}
// 截图数据 // 截图数据
semaphore.wait()
Print("正在处理截图") Print("正在处理截图")
PhotoAndVideoMananger.mananger.dealScreenShotData { data in PhotoAndVideoMananger.mananger.dealScreenShotData { data in
var dataArray : [String] = [] var dataArray : [AssetModel] = []
for item in data { for item in data {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -172,15 +190,13 @@ class PhotoDataManager { ...@@ -172,15 +190,13 @@ class PhotoDataManager {
resultModel(allModel) resultModel(allModel)
Print("处理截图结束") Print("处理截图结束")
}) })
semaphore.signal()
} }
// 相似视频 // 相似视频
semaphore.wait()
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 : [String] = [] var dataArray : [AssetModel] = []
for item in ids { for item in ids {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -192,15 +208,12 @@ class PhotoDataManager { ...@@ -192,15 +208,12 @@ class PhotoDataManager {
resultModel(allModel) resultModel(allModel)
}) })
Print("处理相似视频结束") Print("处理相似视频结束")
semaphore.signal()
} }
} }
// 照片数据 // 照片数据
semaphore.wait()
Print("正在处理其他")
PhotoAndVideoMananger.mananger.dealImageAssetData { data in PhotoAndVideoMananger.mananger.dealImageAssetData { data in
var dataArray : [String] = [] var dataArray : [AssetModel] = []
for item in data { for item in data {
dataArray = dataArray + item dataArray = dataArray + item
} }
...@@ -211,12 +224,11 @@ class PhotoDataManager { ...@@ -211,12 +224,11 @@ class PhotoDataManager {
model7.allFileSize = Double(fileSize) model7.allFileSize = Double(fileSize)
resultModel(allModel) resultModel(allModel)
// 最后做一下缓存 // 最后做一下缓存
PhotoDataManager.manager.saveToFileSystem(model: allModel) // PhotoDataManager.manager.saveToFileSystem(model: allModel)
}) })
semaphore.signal()
} }
} // }
} }
} }
...@@ -239,11 +251,26 @@ class HomePhotosModel:Codable { ...@@ -239,11 +251,26 @@ class HomePhotosModel:Codable {
var folderName:String var folderName:String
var allFileSize:Double var allFileSize:Double
var assets:[[String]] var assets:[[AssetModel]]
init(folderName: String, allFileSize: Double, assets: [[String]]) { init(folderName: String, allFileSize: Double, assets: [[AssetModel]]) {
self.folderName = folderName self.folderName = folderName
self.allFileSize = allFileSize self.allFileSize = allFileSize
self.assets = assets self.assets = assets
} }
} }
class AssetModel :Codable {
var localIdentifier : String
var assetSize : Double
var createDate : Date
init(localIdentifier: String, assetSize: Double, createDate: Date) {
self.localIdentifier = localIdentifier
self.assetSize = assetSize
self.createDate = createDate
}
}
...@@ -10,5 +10,5 @@ import Photos ...@@ -10,5 +10,5 @@ import Photos
struct ImageCollectionModel { struct ImageCollectionModel {
var asset:String var asset:AssetModel
} }
...@@ -10,7 +10,7 @@ import UIKit ...@@ -10,7 +10,7 @@ import UIKit
class ImageSeletedCollectionItem { class ImageSeletedCollectionItem {
var id:String = "" var id:AssetModel?
var image:UIImage? var image:UIImage?
var isSeleted:Bool? var isSeleted:Bool?
} }
......
...@@ -130,7 +130,7 @@ class HomeOtherCollectionCell: UICollectionViewCell { ...@@ -130,7 +130,7 @@ class HomeOtherCollectionCell: UICollectionViewCell {
guard let asset = model.assets.first?.first else {return} guard let asset = model.assets.first?.first else {return}
if self.mediaType == 0 { if self.mediaType == 0 {
let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: asset) let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: asset.localIdentifier)
DispatchQueue.main.async {[weak self] in DispatchQueue.main.async {[weak self] in
guard let self else {return} guard let self else {return}
imageView.image = image imageView.image = image
...@@ -148,7 +148,7 @@ class HomeOtherCollectionCell: UICollectionViewCell { ...@@ -148,7 +148,7 @@ class HomeOtherCollectionCell: UICollectionViewCell {
// 异步请求 // 异步请求
options.isSynchronous = false options.isSynchronous = false
// 从 PHAsset 获取 AVAsset // 从 PHAsset 获取 AVAsset
if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [asset]){ if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [asset.localIdentifier]){
// 使用requestImageForAsset方法请求视频的第一帧图片 // 使用requestImageForAsset方法请求视频的第一帧图片
PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in
// 处理获取到的图片 // 处理获取到的图片
......
...@@ -12,7 +12,7 @@ class HomePhotosDetailCollectionCell : UICollectionViewCell { ...@@ -12,7 +12,7 @@ class HomePhotosDetailCollectionCell : UICollectionViewCell {
var clickCallBack : (Bool,Int)->Void = {choose,order in} var clickCallBack : (Bool,Int)->Void = {choose,order in}
var cellCallBack : (String,Int)->Void = {ident,order in} var cellCallBack : (AssetModel,Int)->Void = {ident,order in}
var currentMediaType : Int = 0 var currentMediaType : Int = 0
...@@ -27,10 +27,10 @@ class HomePhotosDetailCollectionCell : UICollectionViewCell { ...@@ -27,10 +27,10 @@ class HomePhotosDetailCollectionCell : UICollectionViewCell {
} }
} }
var resourceIdent : String = "" { var resourceIdent : AssetModel = AssetModel(localIdentifier: "", assetSize: 0.0, createDate: Date()) {
didSet{ didSet{
DispatchQueue.global().async { DispatchQueue.global().async {
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [self.resourceIdent], options: nil) let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [self.resourceIdent.localIdentifier], options: nil)
let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count)) let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count))
let options = PHImageRequestOptions() let options = PHImageRequestOptions()
options.isNetworkAccessAllowed = true options.isNetworkAccessAllowed = true
......
...@@ -107,9 +107,6 @@ class HomeTitleCollectionCell:UICollectionViewCell { ...@@ -107,9 +107,6 @@ class HomeTitleCollectionCell:UICollectionViewCell {
assetsModels.append(smodel) assetsModels.append(smodel)
} }
Print(assetsModels)
Print(model.assets)
DispatchQueue.main.async {[weak self] in DispatchQueue.main.async {[weak self] in
guard let self else {return} guard let self else {return}
......
...@@ -12,11 +12,11 @@ class HomeVideoDetailCell : UICollectionViewCell { ...@@ -12,11 +12,11 @@ class HomeVideoDetailCell : UICollectionViewCell {
var clickCallBack : (Bool,Int)->Void = {choose,order in} var clickCallBack : (Bool,Int)->Void = {choose,order in}
var cellCallBack : (String,Int)->Void = {ident,order in} var cellCallBack : (AssetModel,Int)->Void = {ident,order in}
var currentMediaType : Int = 0 var currentMediaType : Int = 0
var resourceIdent : String = "" { var resourceIdent : AssetModel? {
didSet{ didSet{
// 定义请求选项来获取视频的第一帧 // 定义请求选项来获取视频的第一帧
let options = PHImageRequestOptions() let options = PHImageRequestOptions()
...@@ -29,7 +29,7 @@ class HomeVideoDetailCell : UICollectionViewCell { ...@@ -29,7 +29,7 @@ class HomeVideoDetailCell : UICollectionViewCell {
// 异步请求 // 异步请求
options.isSynchronous = true options.isSynchronous = true
// 从 PHAsset 获取 AVAsset // 从 PHAsset 获取 AVAsset
if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [resourceIdent]){ if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [resourceIdent!.localIdentifier]){
// 使用requestImageForAsset方法请求视频的第一帧图片 // 使用requestImageForAsset方法请求视频的第一帧图片
PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in
// 处理获取到的图片 // 处理获取到的图片
...@@ -149,7 +149,7 @@ class HomeVideoDetailCell : UICollectionViewCell { ...@@ -149,7 +149,7 @@ class HomeVideoDetailCell : UICollectionViewCell {
} }
@objc func cellClick(){ @objc func cellClick(){
cellCallBack(self.resourceIdent,self.currentOrder) cellCallBack(self.resourceIdent!,self.currentOrder)
} }
......
...@@ -34,7 +34,7 @@ class ImageCollectionCell:UICollectionViewCell { ...@@ -34,7 +34,7 @@ class ImageCollectionCell:UICollectionViewCell {
guard let self else {return} guard let self else {return}
let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: model.asset) let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: model.asset.localIdentifier)
DispatchQueue.main.async {[weak self] in DispatchQueue.main.async {[weak self] in
......
...@@ -71,7 +71,7 @@ class ImageSeletedCollectionCell:UICollectionViewCell { ...@@ -71,7 +71,7 @@ class ImageSeletedCollectionCell:UICollectionViewCell {
// 异步请求 // 异步请求
options.isSynchronous = false options.isSynchronous = false
// 从 PHAsset 获取 AVAsset // 从 PHAsset 获取 AVAsset
if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [model.id]){ if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [model.id!.localIdentifier]){
// 使用requestImageForAsset方法请求视频的第一帧图片 // 使用requestImageForAsset方法请求视频的第一帧图片
PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in
// 处理获取到的图片 // 处理获取到的图片
...@@ -89,7 +89,7 @@ class ImageSeletedCollectionCell:UICollectionViewCell { ...@@ -89,7 +89,7 @@ class ImageSeletedCollectionCell:UICollectionViewCell {
} }
} }
}else{ }else{
if let asset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [model.id]){ if let asset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [model.id!.localIdentifier]){
let image = PhotoAndVideoMananger.mananger.getImageFromAsset(asset: asset) let image = PhotoAndVideoMananger.mananger.getImageFromAsset(asset: asset)
model.image = image model.image = image
......
...@@ -185,7 +185,7 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa ...@@ -185,7 +185,7 @@ extension PMShowImgVideoController : UICollectionViewDelegate,UICollectionViewDa
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PMShowVideoCellID, for: indexPath) as! PMShowVideoCell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PMShowVideoCellID, for: indexPath) as! PMShowVideoCell
// 获取相似视频的URL // 获取相似视频的URL
DispatchQueue.global().async { DispatchQueue.global().async {
self.getVideoURLFromLocalIdentifier(localIdentifier: self.homeDataSource![indexPath.row].id) {[weak self] url, error in self.getVideoURLFromLocalIdentifier(localIdentifier: self.homeDataSource![indexPath.row].id!.localIdentifier) {[weak self] url, error in
guard self != nil else {return} guard self != nil else {return}
if let error = error { if let error = error {
print("获取视频 URL 时出错: \(error.localizedDescription)") print("获取视频 URL 时出错: \(error.localizedDescription)")
......
...@@ -606,10 +606,10 @@ class PhotoAndVideoMananger { ...@@ -606,10 +606,10 @@ class PhotoAndVideoMananger {
return assetsArray.first return assetsArray.first
} }
func getPHAsssetwithIDs(ids :[String]) -> [PHAsset]? { func getPHAsssetwithIDs(ids :[AssetModel]) -> [PHAsset]? {
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: ids, options: nil)
let localIdentifiers = ids.map { $0.localIdentifier }
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: localIdentifiers, options: nil)
let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count)) let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count))
return assetsArray return assetsArray
...@@ -659,31 +659,100 @@ class PhotoAndVideoMananger { ...@@ -659,31 +659,100 @@ class PhotoAndVideoMananger {
// MARK: - 新方法处理相似图片向下------------------------------------------------------- // MARK: - 新方法处理相似图片向下-------------------------------------------------------
func dealSimilarPhotos(assets:[PHAsset],threshold: Double , completionHandler:@escaping ([[String]])->Void){ func dealSimilarPhotos(assets:[PHAsset] , threshold: Double , processHandler:@escaping ([[AssetModel]],[[AssetModel]])->Void, completionHandler:@escaping ([[AssetModel]],[[AssetModel]])->Void){
// 重复照片
var index = assets.startIndex DispatchQueue.global().async {
var count = 0 // 图片请求选项
var finalData :[[String]] = [] let imageRequestOptions = PHImageRequestOptions()
while index < assets.endIndex { imageRequestOptions.isSynchronous = true
let nextIndex = assets.index(index, offsetBy: 5, limitedBy: assets.endIndex) ?? assets.endIndex imageRequestOptions.deliveryMode = .highQualityFormat
// 当前组
let chunk = Array(assets[index..<nextIndex])
index = nextIndex var groupDuplicateAssets :[[AssetModel]] = []
var groupSimilarAssets :[[AssetModel]] = []
dealSimilarDetailPhotos(assets: chunk as [PHAsset], threshold: threshold) { data in
count = count + chunk.count
finalData = finalData + data for (currentIndex, currentAsset) in assets.enumerated() {
if count == assets.count { var currentDuplicateGroup : [AssetModel] = []
completionHandler(finalData) var currentSimilarGroup : [AssetModel] = []
// 先添加一个到model
let currentModel = AssetModel.init(localIdentifier: currentAsset.localIdentifier, assetSize: PhotoAndVideoMananger.mananger.findAssetSize(asset: currentAsset), createDate: currentAsset.creationDate!)
currentDuplicateGroup.append(currentModel)
PHImageManager.default().requestImage(for: currentAsset, targetSize: CGSizeMake(400, 400), contentMode: .aspectFit, options: imageRequestOptions) {image1, info1 in
let nextIndex = currentIndex + 1
if nextIndex <= assets.count {
for changeIndex in nextIndex..<assets.count {
let changeAsset = assets[changeIndex]
PHImageManager.default().requestImage(for: changeAsset, targetSize: CGSizeMake(400, 400), contentMode: .aspectFit, options: imageRequestOptions) {image2, info2 in
let isSamilar : Double = OpenCVWrapper.compareImageSimilarity(image1, withImage2: image2)
if isSamilar > 0.995 && isSamilar < 0.996{
currentSimilarGroup.append(AssetModel(localIdentifier: changeAsset.localIdentifier, assetSize: self.findAssetSize(asset: changeAsset), createDate: changeAsset.creationDate!))
}
if isSamilar > 0.999 {
currentDuplicateGroup.append(AssetModel(localIdentifier: changeAsset.localIdentifier, assetSize: self.findAssetSize(asset: changeAsset), createDate: changeAsset.creationDate!))
}
}
}
}
if(currentSimilarGroup.count >= 2){
groupSimilarAssets.append(currentSimilarGroup)
}
if(currentDuplicateGroup.count >= 2){
groupDuplicateAssets.append(currentDuplicateGroup)
}
processHandler(groupDuplicateAssets,groupSimilarAssets)
} }
}
completionHandler(groupDuplicateAssets,groupSimilarAssets)
}
// // 重复照片
// var index = assets.startIndex
// var count = 0
// var finalData :[[AssetModel]] = []
// while index < assets.endIndex {
// let nextIndex = assets.index(index, offsetBy: 5, limitedBy: assets.endIndex) ?? assets.endIndex
// // 当前组
// let chunk = Array(assets[index..<nextIndex])
// index = nextIndex
//
// dealSimilarDetailPhotos(assets: chunk as [PHAsset], allAssets: assets, threshold: threshold) { data in
// count = count + chunk.count
// finalData = finalData + data
// if count == assets.count {
// completionHandler(finalData)
// }
// }
// }
}
/// 计算asset资源大小
/// - Parameter asset: 资源
/// - Returns: 文件大小
func findAssetSize(asset: PHAsset)->Double{
let resources = PHAssetResource.assetResources(for: asset)
var assetSize : Int = 0
for resource in resources {
if let fileSize = resource.value(forKey: "fileSize") as? Int64 {
assetSize += Int(fileSize)
} }
} }
return Double(assetSize)
} }
// 和上面的方法一起处理,防止内存崩溃 // 和上面的方法一起处理,防止内存崩溃
private func dealSimilarDetailPhotos(assets:[PHAsset],threshold: Double , completionHandler:@escaping ([[String]])->Void){ private func dealSimilarDetailPhotos(assets:[PHAsset],allAssets:[PHAsset],threshold: Double , completionHandler:@escaping ([[AssetModel]])->Void){
var groupAssets :[[String]] = [] var groupAssets :[[AssetModel]] = []
// 图片请求选项 // 图片请求选项
let imageRequestOptions = PHImageRequestOptions() let imageRequestOptions = PHImageRequestOptions()
...@@ -695,22 +764,22 @@ class PhotoAndVideoMananger { ...@@ -695,22 +764,22 @@ class PhotoAndVideoMananger {
// 开一个线程去处理 // 开一个线程去处理
DispatchQueue.global().async { // DispatchQueue.global().async {
// 需要监听是否完成 // 需要监听是否完成
var count1 = 0 var count1 = 0
var count2 = 0
for asset in assets { for asset in assets {
PHImageManager.default().requestImage(for: asset, targetSize: CGSizeMake(50, 50), contentMode: .aspectFit, options: imageRequestOptions) { image1, info in PHImageManager.default().requestImage(for: asset, targetSize: CGSizeMake(50, 50), contentMode: .aspectFit, options: imageRequestOptions) { [self] image1, info in
var currentGroup : [String] = [] var currentGroup : [AssetModel] = []
// 如果当前组为空,先加一个上去 // 如果当前组为空,先加一个上去
currentGroup.append(asset.localIdentifier) currentGroup.append(AssetModel(localIdentifier: asset.localIdentifier, assetSize: self.findAssetSize(asset: asset), createDate: asset.creationDate!))
// 然后分成区域比较 // 然后分成区域比较
var index = assets.startIndex var index = assets.startIndex
while index < assets.endIndex { var count2 = 0
let nextIndex = assets.index(index, offsetBy: 20, limitedBy: assets.endIndex) ?? assets.endIndex while index < allAssets.endIndex {
let nextIndex = assets.index(index, offsetBy: 10, limitedBy: allAssets.endIndex) ?? allAssets.endIndex
// 当前组 // 当前组
var chunk = Array(assets[index..<nextIndex]) var chunk = Array(allAssets[index..<nextIndex])
index = nextIndex index = nextIndex
// 比较image重复 // 比较image重复
for item in chunk { for item in chunk {
...@@ -720,82 +789,110 @@ class PhotoAndVideoMananger { ...@@ -720,82 +789,110 @@ class PhotoAndVideoMananger {
let isSamilar : Bool = OpenCVWrapper.areImagesSimilar(image1, withImage2: image2, threshold: threshold) let isSamilar : Bool = OpenCVWrapper.areImagesSimilar(image1, withImage2: image2, threshold: threshold)
// 如果相似或者相同 // 如果相似或者相同
if isSamilar { if isSamilar {
currentGroup.append(item.localIdentifier) currentGroup.append(AssetModel(localIdentifier: item.localIdentifier, assetSize: self.findAssetSize(asset: item), createDate: item.creationDate!))
} }
count2 = count2 + 1
} }
if count2 == assets.count && currentGroup.count >= 2 { }
// 将trunk移除
count2 = count2 + chunk.count
if count2 == allAssets.count {
// 对当前组去重
let result = removeDuplicates(currentGroup)
if(result.count >= 2){
groupAssets.append(currentGroup) groupAssets.append(currentGroup)
} }
} }
// 将trunk移除
chunk.removeAll(keepingCapacity: false) chunk.removeAll(keepingCapacity: false)
} }
count1 = count1 + 1
currentGroup.removeAll(keepingCapacity: false) currentGroup.removeAll(keepingCapacity: false)
} }
count1 = count1 + 1
if count1 == assets.count { if count1 == assets.count {
completionHandler(self.removeDuplicates(from: groupAssets)) completionHandler(self.removeDuplicatesIn2DArray(groupAssets, keyPath: \.localIdentifier))
} }
} }
// }
}
// 去掉一维数组重复数据
func removeDuplicates(_ array: [AssetModel]) -> [AssetModel] {
var uniqueLocalIdentifiers: [String] = []
var uniqueModel: [AssetModel] = []
for model in uniqueModel {
if !uniqueLocalIdentifiers.contains(model.localIdentifier) {
uniqueLocalIdentifiers.append(model.localIdentifier)
uniqueModel.append(model)
}
} }
return uniqueModel
} }
/// 去掉数据重复 /// 去掉数据重复
/// - Parameter array: 当前数据 /// - Parameter array: 当前数据
/// - Returns: 去重后的数据 /// - Returns: 去重后的数据
func removeDuplicates(from array: [[String]]) -> [[String]] {
var set = Set<[String]>() func removeDuplicatesIn2DArray<T: Hashable>(_ array: [[AssetModel]], keyPath: KeyPath<AssetModel, T>) -> [[AssetModel]] {
var result: [[String]] = [] return array.map { innerArray in
var seen = Set<T>()
for subArray in array { return innerArray.filter {
if set.insert(subArray).inserted { if seen.contains($0[keyPath: keyPath]) {
result.append(subArray) return false
} else {
seen.insert($0[keyPath: keyPath])
return true
}
} }
} }
return result
} }
// MARK: - 新方法处理相似图片向上------------------------------------------------------- // MARK: - 新方法处理相似图片向上-------------------------------------------------------
// MARK: - 处理视频数据------------------------------------------------------- // MARK: - 处理视频数据-------------------------------------------------------
func dealVideoData(completionHandler:@escaping ([[String]])->Void){ func dealVideoData(completionHandler:@escaping ([[AssetModel]])->Void){
var data:[String] = [] DispatchQueue.global().async {
for item in self.videoAssets { var data:[AssetModel] = []
data.append(item.localIdentifier) for item in self.videoAssets {
data.append(AssetModel.init(localIdentifier: item.localIdentifier, assetSize: self.findAssetSize(asset: item), createDate: item.creationDate!))
}
var finalData : [[AssetModel]] = []
finalData.append(data)
completionHandler(finalData)
} }
var finalData : [[String]] = []
finalData.append(data)
completionHandler(finalData)
} }
// MARK: - 处理视频数据------------------------------------------------------- // MARK: - 处理视频数据-------------------------------------------------------
// MARK: - 处理截图数据------------------------------------------------------- // MARK: - 处理截图数据-------------------------------------------------------
func dealScreenShotData(completionHandler:@escaping ([[String]])->Void){ func dealScreenShotData(completionHandler:@escaping ([[AssetModel]])->Void){
var data:[String] = []
for item in self.screenShotAssets { DispatchQueue.global().async {
data.append(item.localIdentifier) var data:[AssetModel] = []
for item in self.screenShotAssets {
data.append(AssetModel(localIdentifier: item.localIdentifier, assetSize: self.findAssetSize(asset: item), createDate: item.creationDate!))
}
var finalData : [[AssetModel]] = []
finalData.append(data)
completionHandler(finalData)
} }
var finalData : [[String]] = []
finalData.append(data)
completionHandler(finalData)
} }
// MARK: - 处理截图数据------------------------------------------------------- // MARK: - 处理截图数据-------------------------------------------------------
// MARK: - 处理照片数据------------------------------------------------------- // MARK: - 处理照片数据-------------------------------------------------------
func dealImageAssetData(completionHandler:@escaping ([[String]])->Void){ func dealImageAssetData(completionHandler:@escaping ([[AssetModel]])->Void){
var data:[String] = [] DispatchQueue.global().async {
for item in self.otherAssets { var data:[AssetModel] = []
data.append(item.localIdentifier) for item in self.otherAssets {
data.append(AssetModel(localIdentifier: item.localIdentifier, assetSize: self.findAssetSize(asset: item), createDate: item.creationDate!))
}
var finalData : [[AssetModel]] = []
finalData.append(data)
completionHandler(finalData)
} }
var finalData : [[String]] = []
finalData.append(data)
completionHandler(finalData)
} }
// MARK: - 处理截图数据------------------------------------------------------- // MARK: - 处理截图数据-------------------------------------------------------
...@@ -806,7 +903,7 @@ class PhotoAndVideoMananger { ...@@ -806,7 +903,7 @@ class PhotoAndVideoMananger {
/// - Parameters: /// - Parameters:
/// - ident: 视频的标识 /// - ident: 视频的标识
/// - finished: 完成回调 /// - finished: 完成回调
func getVideoImageByIdent(ident: String,finished:@escaping (UIImage)->Void,errorHandler:@escaping ()->Void){ func getVideoImageByIdent(ident: AssetModel,finished:@escaping (UIImage)->Void,errorHandler:@escaping ()->Void){
// 定义请求选项来获取视频的第一帧 // 定义请求选项来获取视频的第一帧
let options = PHImageRequestOptions() let options = PHImageRequestOptions()
// 获取当前版本的照片或视频 // 获取当前版本的照片或视频
...@@ -818,7 +915,7 @@ class PhotoAndVideoMananger { ...@@ -818,7 +915,7 @@ class PhotoAndVideoMananger {
// 异步请求 // 异步请求
options.isSynchronous = true options.isSynchronous = true
// 从 PHAsset 获取 AVAsset // 从 PHAsset 获取 AVAsset
if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [ident]){ if let videoAsset = PhotoAndVideoMananger.mananger.getPHAsssetwithID(ids: [ident.localIdentifier]){
// 使用requestImageForAsset方法请求视频的第一帧图片 // 使用requestImageForAsset方法请求视频的第一帧图片
PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in
// 处理获取到的图片 // 处理获取到的图片
......
...@@ -305,7 +305,7 @@ class PhotoSimilarityFinder { ...@@ -305,7 +305,7 @@ class PhotoSimilarityFinder {
} }
} }
static func processSimilarVideoGroups(videoGroups: [[PHAsset]], completion: @escaping ([[String]]) -> Void) { static func processSimilarVideoGroups(videoGroups: [[PHAsset]], completion: @escaping ([[AssetModel]]) -> Void) {
print("开始处理相似视频组...") print("开始处理相似视频组...")
// 创建并发队列 // 创建并发队列
...@@ -390,11 +390,14 @@ class PhotoSimilarityFinder { ...@@ -390,11 +390,14 @@ class PhotoSimilarityFinder {
// 等待所有处理完成 // 等待所有处理完成
group.notify(queue: .main) { group.notify(queue: .main) {
// 将结果转换为 localIdentifier 数组 // 将结果转换为 localIdentifier 数组
let result = filteredGroups.map { group in var result :[[AssetModel]] = []
group.map { $0.localIdentifier } for item in filteredGroups{
var model : [AssetModel] = []
for item2 in item {
model.append(AssetModel(localIdentifier: item2.localIdentifier, assetSize: findAssetSize(asset: item2), createDate: item2.creationDate!))
}
result.append(model)
} }
print("处理完成,剩余 \(result.count) 组相似视频")
completion(result) completion(result)
} }
} }
...@@ -437,4 +440,18 @@ class PhotoSimilarityFinder { ...@@ -437,4 +440,18 @@ class PhotoSimilarityFinder {
} }
} }
} }
/// 计算asset资源大小
/// - Parameter asset: 资源
/// - Returns: 文件大小
private static func findAssetSize(asset: PHAsset)->Double{
let resources = PHAssetResource.assetResources(for: asset)
var assetSize : Int = 0
for resource in resources {
if let fileSize = resource.value(forKey: "fileSize") as? Int64 {
assetSize += Int(fileSize)
}
}
return Double(assetSize)
}
} }
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