2017-03-07 113 views
2

我有以下代码多次调用。PHPhotoLibrary photoLibraryDidChange斯威夫特

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

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

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

+0

您是否找到解决方案?我刚刚实现了'PHPhotoLibraryChangeObserver'协议,并在查看我的'UICollectionView'时通过截图进行测试。我注意到,当我拍摄屏幕截图时,会调用photoLibraryDidChange(_ changeInstance:PHChange)两次。 –

+0

也在寻找答案。在我的代码中,photoLibraryDidChange被调用了大约3次。但大多数时候只是没有实际的变化 –

回答

0

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

首先,保存你的PHFetResult<PHAsset>如果你使用这个方法调用PHAsset.fetchAssets(with:options:)

之后,使用您的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() 
      } 
     } 
    } 

} 

希望这有助于你!