10

私のアプリの一部には、AppleのPhotosアプリにいくぶん似た写真ブラウザがあり、写真のサムネイルを閲覧するための初期ビューコントローラと、写真をタップしたときに表示される詳細ビューがあります。

ALAssetsLibraryを使用して写真にアクセスし、ALAsset URLの配列を詳細ビューコントローラーに渡して、ある写真から次の写真にスワイプできるようにします。

(詳細ビューコントローラで)ある写真から別の写真にスワイプしているときにALAssetsLibraryChangedNotificationを受信するまで、すべてがうまく機能します。これにより、クラッシュが発生することがよくあります。

通知:アセットライブラリが変更されました//通知が発生したときの自分のNSLog

アセットを読み込んでいます...//サムネイルブラウザでアセットのリロードを開始するときの自分のNSLog

アサーションに失敗しました:(size == bytesRead)、関数-[ALAssetRepresentation _imageData]、ファイル/SourceCache/AssetsLibrary/MobileSlideShow-1373.58.1/Sources/ALAssetRepresentation.m、行224。

クラッシュする特定のコード行は、次のように[currentRepメタデータ]を呼び出すことです。

- (void)someMethod {
        NSURL *assetURL = [self.assetURLsArray objectAtIndex:index];
        ALAsset *currentAsset;

        [self.assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {

            [self performSelectorInBackground:@selector(configureDetailViewForAsset:) withObject:asset];

            } failureBlock:^(NSError *error) {
                    NSLog(@"failed to retrieve asset: %@", error);
        }];
}

- (void)configureDetailViewForAsset:(ALAsset *)currentAsset {
    ALAssetRepresentation *currentRep = [currentAsset defaultRepresentation];

    if (currentAsset != nil) {
        // do some stuff
    }
    else {
        NSLog(@"ERROR: currentAsset is nil");
    }

    NSDictionary *metaDictionary;
    if (currentRep != nil) {
        metaDictionary = [currentRep metadata];

        // do some other stuff
    }
    else {
        NSLog(@"ERROR: currentRep is nil");
    }
}

通知を受信すると、ALAssetおよびALAssetRepresentationオブジェクトへの参照が無効になることを理解しています...しかし、アクセスしようとしている最中に何かが無効になる状況にどのように対処する必要がありますか?

通知を受け取ったときにBOOLを設定して、[currentRepメタデータ]が完全に中止されて呼び出されないようにしましたが、それでも毎回キャッチされるわけではありません。

if (self.receivedLibraryChangeNotification) {
    NSLog(@"received library change notification, need to abort");
}
else {
    metaDictionary = [currentRep metadata];
}

何か私にできることはありますか?この時点で、ALAssetsLibraryフレームワークの使用をあきらめる準備がほぼ整いました。

(同じ問題を説明しているApple devフォーラムのこの未解決のスレッドに注意してください:https ://devforums.apple.com/message/604430 )

4

1 に答える 1

6

問題はここにあるようです:

[self.assetsLibrary assetForURL:nextURL 

    resultBlock:^(ALAsset *asset) {
        // You should do some stuff with asset at this scope
        ALAssetRepresentation *currentRep = [asset defaultRepresentation];
        // Assume we have a property for that
        self.assetRepresentationMetadata = [currentRep metadata];
        ...
        // assume we have a method for that
        [self updateAssetDetailsView];
    } 

    failureBlock:^(NSError *error) {
        NSLog(@"failed to retrieve asset: %@", error);
    }];

ユーザー資産を取得したら、必要なデータを詳細コントローラーのサブビューに提供するか、後で使用するためにキャッシュして、資産情報をコピーすることをお勧めします。ALAsset 無効化の問題を回避するのに役立ちます。通知 ALAssetsLibraryChangedNotification が送信されたときに、詳細コントローラーを破棄し、ライブラリ コンテンツを最初からクエリする必要がある場合があります。

于 2012-05-26T11:09:15.337 に答える