2017-03-07 4 views
2

Je le code suivant:PHPhotoLibrary - photoLibraryDidChange appelé plusieurs fois à Swift

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

et je l'ai mis à exécution les PHPhotoLibraryDidChangeObserver.

Mon problème est que la méthode photoLibraryDidChange est appelée plusieurs fois si quelque chose change dans la galerie de l'appareil.
Voici le code de cette fonction:

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

Savez-vous pourquoi cette méthode est exécuté multiple fois?

+0

Avez-vous trouvé une solution? J'ai juste implémenté le protocole 'PHPhotoLibraryChangeObserver' et l'ai testé en prenant une capture d'écran tout en regardant mon' UICollectionView'. J'ai remarqué que 'photoLibraryDidChange (_ changeInstance: PHChange)' est appelé deux fois lorsque je prends une capture d'écran. –

+0

cherche également une réponse pour cela. Dans mon code, photoLibraryDidChange est appelé environ 3 fois. Mais la plupart du temps seulement sans changements réels –

Répondre

0

Avez-vous trouvé une solution? Cela résout le problème:

D'abord, enregistrez votre PHFetResult<PHAsset> lorsque vous appelez PHAsset.fetchAssets(with:options:) si vous utilisez cette méthode. Ensuite, utilisez votre variable PHFetResult<PHAsset> pour valider si le résultat d'extraction a des modifications dans la méthode photoLibraryDidChange:. La première fois que cette méthode est appelée, vous devez mettre à jour vers la vue de collection ou la vue de table. Après cela, votre résultat de recherche n'a pas changé alors ... vous n'avez rien à mettre à jour.

Ceci est mon code complet:

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

} 

Hope this vous aide!