2

当我使用 ALAssetLibrary 获取照片时,对于某些图像,AssetRepresentation.size 在我的 ImageView 上归零,这不会生成图像。这是代码:

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 的释放会在读取过程中的某个地方执行。

我建议您在应用程序委托中创建您的assetLibrary 以使其保持活动状态,并且仅在您从 ALAssetLibrary收到更改通知ALAssetsLibraryChangedNotification时重置它

于 2012-08-22T17:14:57.063 回答
0

我认为您过早地发布了资产库。

于 2012-08-20T04:26:07.360 回答