2016-07-26 23 views
2

我正在使用PHPhotoLibrary在iPhone中爲我的應用程序相冊保存和獲取圖像。在PHPhotoLibrary中,photoLibraryDidChange不會通知所有更新

當我的相冊有很多圖像(約5000張靜止圖像)時,我的應用程序從網絡下載10張圖像,然後保存到相機膠捲並添加到我的應用程序相冊中。

與此同時,應用程序觀察到photoLibraryDidChange回調知道添加的圖像,但它通知只有5插入圖像。

我通過按HOME按鈕完成我的應用程序,並檢查照片應用程序中的相機膠捲和我的相冊。 有正確的5010圖像。

也許photoLibraryDidChagne不通知所有更改?

我的代碼如下所示。

- (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]; 
} 

我檢查插入的資產NSLog和調試器,它真正更新5個圖像。

其他5張圖像沒有通知。

回答

0

我修正了我的代碼中的錯誤點,並確認修改後不會發生問題。

錯點:

  1. 在某些情況下,我的代碼的迴歸;「在回調中提取資產集合之前。
  2. fetchResultChangeDetails.fetchResultAfterChanges instaed的[PHAsset fetchAssetsInAssetCollection:options:]

我所指向的下列蘋果的代碼修改,我應該獲取新的結果。

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

我的固定代碼是象下面這樣。謝謝。

- (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]; 
      } 
     } 
    } 
}