2016-07-26 3 views
2

Ich verwende PHPhotoLibrary, um Bilder für das Album meiner Anwendung in iPhone zu speichern und abzurufen.In PHPhotoLibrary benachrichtigt photoLibraryDidChange nicht alle Updates

Wenn mein Album viele Bilder hat (etwa 5000 Standbilder), meine Anwendung 10 Bilder aus dem Netzwerk herunterladen, dann auf Camera Roll speichern und zum Album meiner Anwendung hinzufügen.

Zur gleichen Zeit, die Anwendung beobachten photoLibraryDidChange Rückruf, um die hinzugefügten Bilder zu kennen, aber es benachrichtigen nur 5 eingefügte Bilder.

Ich beende meine Bewerbung, indem ich die HOME-Taste drücke und die Kamera-Rolle und mein Album in der Foto-App überprüfe. Es sind korrekt 5010 Bilder vorhanden.

Vielleicht meldet photoLibraryDidChagne nicht alle Änderungen?

Mein Code ist wie folgt.

- (void)photoLibraryDidChange:(PHChange *)changeInstance 
{ 
    // dispatch main queue 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self handleChangedLibrary:changeInstance]; 
    }); 
} 

- (void)handleChangedLibrary:(PHChange *)changeInstance 
{ 
    PHFetchResultChangeDetails *fetchResultChangeDetails = [changeInstance changeDetailsForFetchResult:_assetsFetchResult]; 

    if (!fetchResultChangeDetails) { 
     NSLog(@"### No change in fetchResultChangeDetails ###"); 
     return; 
    } 

    if (![fetchResultChangeDetails hasIncrementalChanges]) { 
     [self fetchAllAssets]; 
     return; 
    } 

    NSArray *insertedObjects = [fetchResultChangeDetails insertedObjects]; 
    if (insertedObjects) { 
     for (PHAsset *asset in insertedObjects) { 
      if (asset.mediaType == PHAssetMediaTypeImage) { 
       NSLog(@"asset=%@", asset); 
       [_stillImageAssetArray addObject:asset]; 
      } 
     } 
    } 

    self.assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:_assetCollection options:nil]; 
} 

Ich überprüfte Asset von NSLog und Debugger eingefügt und es aktualisiert wirklich 5 Bilder.

Es gibt keine Benachrichtigung für die anderen 5 Bilder.

Antwort

0

Ich habe falsche Punkte in meinem Code behoben und bestätigt, dass das Problem nach der Änderung nicht auftritt.

Falsche Punkte:

  1. In einigen Fällen meinen Code "Rückkehr"; vor dem Abrufen der Asset-Sammlung im Rückruf.
  2. soll ich neues Ergebnis holt aus fetchResultChangeDetails.fetchResultAfterChanges von [PHAsset fetchAssetsInAssetCollection:options:] instaed

ich die folgenden Apple-Code für die Änderung verwiesen.

PHPhotoLibraryChangeObserver https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibraryChangeObserver_Protocol/

Mein fester Code ist wie unten. Vielen Dank.

- (void)handleChangedLibrary:(PHChange *)changeInstance 
{ 
    // Check for changes to the list of assets (insertions, deletions, moves, or updates). 
    PHFetchResultChangeDetails *fetchResultChangeDetails = [changeInstance changeDetailsForFetchResult:_assetsFetchResult]; 
    if (!fetchResultChangeDetails) { 
     NSLog(@"### No change in fetchResultChangeDetails ###"); 
     return; 
    } 

    // Get the new fetch result for future change tracking. 
    self.assetsFetchResult = fetchResultChangeDetails.fetchResultAfterChanges; 

    if (![fetchResultChangeDetails hasIncrementalChanges]) { 
     [self fetchAllAssets];   
     return; 
    } 

    NSArray *insertedObjects = [fetchResultChangeDetails insertedObjects]; 
    if (insertedObjects) { 
     for (PHAsset *asset in insertedObjects) { 
      if (asset.mediaType == PHAssetMediaTypeImage) { 
       NSLog(@"asset=%@", asset); 
       [_stillImageAssetArray addObject:asset]; 
      } 
     } 
    } 
} 
Verwandte Themen