PHPhotoLibrary-在Swift中多次调用photoLibraryDidChange
我有以下代码:PHPhotoLibrary-在Swift中多次调用photoLibraryDidChange,swift,photosframework,phphotolibrary,Swift,Photosframework,Phphotolibrary,我有以下代码: override func viewDidLoad() { ........ PHPhotoLibrary.shared().register(self) } 我已经实现了PHPhotoLibraryDidChangeObserver 我的问题是,如果设备库中的某些内容发生更改,就会多次调用方法photoLibraryDidChange。 以下是该函数的代码: func photoLibraryDidChange(_ changeInstance: PHChan
override func viewDidLoad() {
........
PHPhotoLibrary.shared().register(self)
}
我已经实现了PHPhotoLibraryDidChangeObserver
我的问题是,如果设备库中的某些内容发生更改,就会多次调用方法photoLibraryDidChange
。以下是该函数的代码:
func photoLibraryDidChange(_ changeInstance: PHChange) {
DispatchQueue.main.async(execute: {
self.updateFetchResult();
})
}
你知道为什么这个方法会执行多次吗?你找到解决办法了吗?
这将解决mi问题:
首先,如果您使用此方法,则在调用PHAsset.fetchAssets(with:options:)
时保存您的PHFetResult
之后,使用phfetfresult
变量验证photoLibraryDidChange:
方法中的获取结果是否有更改。第一次调用此方法时,必须更新到集合视图或表视图。之后,您的获取结果没有更改,因此。。。你没有什么要更新的
这是我的完整代码:
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
self.fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
.
.
.
extension YourViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
if let _fetchResult = self.fetchResult, let _ = changeInstance.changeDetails(for: _fetchResult) {
DispatchQueue.main.async {
self.getPhotos()
}
}
}
}
希望这对你有帮助
extension YourViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
if let _fetchResult = self.fetchResult, let resultDetailChanges = changeInstance.changeDetails(for: _fetchResult) {
let addedItems = resultDetailChanges.insertedObjects
let deletedItems = resultDetailChanges.removedObjects
let changedItems = resultDetailChanges.changedObjects
if resultDetailChanges.hasIncrementalChanges && (addedItems.count > 0 || deletedItems.count > 0 || changedItems.count > 0){
DispatchQueue.main.async {
self.getPhotos()
}
}
}
}
}
以上检查resultDetailChanges.hasIncrementalChanges
和计数(添加、删除、更改的资产)将提供保护,以避免多次调用。请尝试这种方法
extension YourViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
if let _fetchResult = self.fetchResult, let resultDetailChanges = changeInstance.changeDetails(for: _fetchResult) {
let insertedObjects = resultDetailChanges.insertedObjects
let removedObjects = resultDetailChanges.removedObjects
let changedObjects = resultDetailChanges.changedObjects.filter( {
return changeInstance.changeDetails(for: $0)?.assetContentChanged == true
})
if resultDetailChanges.hasIncrementalChanges && (insertedObjects.count > 0 || removedObjects.count > 0 || changedObjects.count > 0){
DispatchQueue.main.async {
self.getPhotos()
}
}
}
}
}
你找到解决办法了吗?我刚刚实现了
PHPhotoLibraryChangeObserver
协议,并在查看我的UICollectionView
时通过截图对其进行了测试。我注意到当我截屏时,photoLibraryDidChange(changeInstance:PHChange)
被调用了两次。我还在寻找答案。在我的代码中,photoLibraryDidChange被调用了大约3次。但大多数时候都没有实际变化,直到有两次我打电话来