【问题标题】:PHPhotoLibrary - photoLibraryDidChange called multiple times in SwiftPHPhotoLibrary - photoLibraryDidChange 在 Swift 中多次调用
【发布时间】:2017-03-07 20:02:00
【问题描述】:

我有以下代码:

override func viewDidLoad() {
    ........
    PHPhotoLibrary.shared().register(self)
}

我已经实现了PHPhotoLibraryDidChangeObserver

我的问题是,如果设备库中的某些内容发生更改,photoLibraryDidChange 方法会被多次调用。
这是该函数的代码:

func photoLibraryDidChange(_ changeInstance: PHChange) {
    DispatchQueue.main.async(execute: {
        self.updateFetchResult();
    })
}

你知道为什么这个方法会被执行multiple 次吗?

【问题讨论】:

  • 您找到解决方案了吗?我刚刚实现了PHPhotoLibraryChangeObserver 协议,并在查看我的UICollectionView 的同时通过截屏对其进行了测试。我注意到当我截屏时,photoLibraryDidChange(_ changeInstance: PHChange) 被调用了两次。
  • 也在寻找答案。在我的代码中, photoLibraryDidChange 被调用了大约 3 次。但大多数时候只是没有实际变化

标签: swift photosframework phphotolibrary


【解决方案1】:

您找到解决方案了吗? 这解决了mi问题:

首先,如果您使用此方法,请在调用PHAsset.fetchAssets(with:options:) 时保存您的PHFetResult<PHAsset>

之后,使用您的PHFetResult<PHAsset> 变量来验证获取结果是否在photoLibraryDidChange: 方法中发生了变化。第一次调用此方法时,您必须更新为集合视图或表格视图。之后,您的 fetch 结果没有改变,所以......您没有什么要更新的。

这是我的完整代码:

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()
            }
        }
    }

}

希望对您有所帮助!

【讨论】:

    【解决方案2】:
    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 和(添加、删除、更改的资产)计数将保护避免多次调用。

    【讨论】:

    • 仍然为我打了两次电话
    【解决方案3】:

    试试这个方法

    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()
                        }
                    }
                }
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多