我有以下代码:
override func viewDidLoad() {
........
PHPhotoLibrary.shared().register(self)
}我已经实现了PHPhotoLibraryDidChangeObserver。
我的问题是,如果设备库中的内容发生变化,photoLibraryDidChange方法会被多次调用。
下面是该函数的代码:
func photoLibraryDidChange(_ changeInstance: PHChange) {
DispatchQueue.main.async(execute: {
self.updateFetchResult();
})
}你知道为什么这个方法会被执行multiple次吗?
发布于 2017-07-08 00:39:28
你找到解决方案了吗?这就是解决mi问题:
首先,如果您使用此方法,请在调用PHAsset.fetchAssets(with:options:)时保存您的PHFetResult<PHAsset>。
之后,使用PHFetResult<PHAsset>变量验证获取结果是否在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()
}
}
}
}希望这对你有帮助!
发布于 2018-05-30 23:27:57
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和计数(添加、删除、更改资产)将起到保护作用,以避免多次调用。
发布于 2020-05-27 16:52:25
试试这条路
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()
}
}
}
}
}https://stackoverflow.com/questions/42657266
复制相似问题