Question

When I am fetching photos using the ALAssetLibrary, for some images, the AssetRepresentation.size comes zero, which does not make the image, on my ImageView. Here is the code:

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];

Please Help. What am I doing wrong here? and how should I get the image?

Was it helpful?

Solution

Joe Smith is right! You release the library too soon. The moment the AssetLibrary is released, all the asset object will be gone with it. And Because these enumeration is block codes so the release of AssetLibrary will be executed somewhere during the reading process.

I suggest that you create your assetLibrary in the app delegate to keep it alive and only reset it when you receive change notification ALAssetsLibraryChangedNotification from the ALAssetLibrary

OTHER TIPS

I think you released the assets library too soon.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top