2

ALAssetLibrary を使用して写真をフェッチすると、一部の画像で、ImageView で AssetRepresentation.size がゼロになり、画像が作成されません。コードは次のとおりです。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqual:self.groupName]) {

        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop){
            //Get the asset type
            NSString *assetType = [result valueForProperty:ALAssetPropertyType];
            if ([assetType isEqualToString:ALAssetTypePhoto]) {
                NSLog(@"Photo Asset");
            }
            //Get URLs for the assets
            NSDictionary *assetURLs = [result valueForProperty:ALAssetPropertyURLs];

            NSUInteger assetCounter = 0;
            for (NSString *assetURLKey in assetURLs) {
                assetCounter++;
            }
            //Get the asset's representation object
            ALAssetRepresentation *assetRepresentation = [result defaultRepresentation];

            //From this asset representation, we take out data for image and show it using imageview.

            dispatch_async(dispatch_get_main_queue(), ^(void){
                CGImageRef imgRef = [assetRepresentation fullResolutionImage];
                //Img Construction
                UIImage *image = [[[UIImage alloc] initWithCGImage:imgRef] autorelease];

                NSLog(@"before %@:::%lld", [image description], [assetRepresentation size]); //Prints '0' for size

                if((image != nil)&& [assetRepresentation size] != 0){

                   //display in image view
                }
                else{
                    // NSLog(@"Failed to load the image.");
                }
            });

        }];
    }
}failureBlock:^(NSError *error){
    NSLog(@"Error retrieving photos: %@", error);
}];


[library release];

助けてください。ここで何が間違っていますか?どうすれば画像を取得できますか?

4

2 に答える 2

2

ジョー・スミスは正しいです!ライブラリのリリースが早すぎます。AssetLibrary がリリースされると、すべてのアセット オブジェクトが削除されます。これらの列挙はブロック コードであるため、AssetLibrary のリリースは読み取りプロセスのどこかで実行されます。

app デリゲートで assetLibrary を作成して有効にし、 ALAssetLibraryから変更通知ALAssetsLibraryChangedNotificationを受け取ったときにのみリセットすることをお勧めします。

于 2012-08-22T17:14:57.063 に答える