2

PHPhotoLibraryiPhone でアプリケーションのアルバムの画像を保存して取得するために使用しています。

アルバムに大量の画像 (約 5,000 枚の静止画像) がある場合、アプリケーションはネットワークから 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 と Debugger で確認したところ、本当に 5 つの画像が更新されました。

他の5枚の画像については通知はありません。

4

1 に答える 1

0

コードの誤りを修正し、修正後に問題が発生しないことを確認しました。

間違った点:

  1. 場合によっては、私のコード 'return;' コールバックでアセット コレクションをフェッチする前。
  2. fetchResultChangeDetails.fetchResultAfterChangesinstaedから新しい結果を取得する必要があります[PHAsset fetchAssetsInAssetCollection:options:]

修正は以下のAppleのコードを参考にしました。

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];
            }
        }
    }
}
于 2016-08-10T07:51:15.267 に答える