私のアプリの一部には、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 )