1

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];
                    }
            }];
        });
    }
}
4

1 に答える 1

6

私は同様の問題を抱えていて、それを理解しようとして髪を引き裂いていました.

ALAssetsLibrary 用にシングルトンをセットアップしたと思っていたのに、コードがそれを適切に呼び出しておらず、一部の ALAssets が空の「fullResolutionImage」を返していたことが判明しました。

すべての NSLog で、Xcode からの最も重要なメッセージを見逃していたに違いありません。

「所有する ALAssetsLibrary の有効期間を過ぎて ALAssetPrivate にアクセスしようとする試みは無効です」

このリンクに従ってください

http://www.daveoncode.com/2011/10/15/solve-xcode-error-invalid-attempt-to-access-alassetprivate-past-the-lifetime-of-its-owning-alassetslibrary/

それが役立つことを願っています

于 2012-11-28T00:26:28.583 に答える