ALAssetsLibrary からバックグラウンドで大量に写真をアップロードする必要があるマルチスレッド アプリケーションを作成しています。したがって、アセットの URL を介して適切な ALAsset を見つけ、画像をアップロード キューに追加する NSOperation サブクラスがあります。
現在の ALAsset のアップロード キューで、画像からメタデータを取得する必要がありますが、問題が発生しました。-metadata メソッドと -fullResolutionImage メソッドの両方が、ALAsset の ALAssetRepresentation で呼び出されたときに返されません。彼らは単にそこに無期限にぶら下がっています。これらの各メソッドの値を LLDB に出力しようとしましたが、デバッガーがハングアップし、Xcode のシグナル 9 スタイルを強制終了しました。これらのメソッドは、バックグラウンド キューで呼び出されています。
私は iPad 2 でこれらをテストしています。これは、ALAsset が -assetForURL:resultBlock:failureBlock の成功ブロックで見つかったときにアップロード キューに追加される方法です。
- (void)addMediaToUploadQueue:(ALAsset *)media {
@autoreleasepool {
ALAssetRepresentation *defaultRepresentation = [media defaultRepresentation];
CGImageRef fullResolutionImage = [defaultRepresentation fullResolutionImage];
// Return if the user is trying to upload an image which has already been uploaded
CGFloat scale = [defaultRepresentation scale];
UIImageOrientation orientation = [defaultRepresentation orientation];
UIImage *i = [UIImage imageWithCGImage:fullResolutionImage scale:scale orientation:orientation];
if (![self isImageUnique:i]) return;
NSDictionary *imageDictionary = [self dictionaryForAsset:media withImage:i];
dispatch_async(self.background_queue, ^{
NSManagedObjectContext *ctx = [APPDELEGATE createManagedObjectContextForThread];
[ctx setUndoManager:nil];
[ctx performBlock:^{
ImageEntity *newImage = [NSEntityDescription insertNewObjectForEntityForName:@"ImageEntity"
inManagedObjectContext:ctx];
[newImage updateWithDictionary:imageDictionary
inManagedObjectContext:ctx];
[ctx save:nil];
[APPDELEGATE saveContext];
dispatch_async(dispatch_get_main_queue(), ^{
[self.fetchedResultsController performFetch:nil];
});
if (!currentlyUploading) {
currentlyUploading = YES;
[self uploadImage:newImage];
}
}];
});
}
}