从UIImagePickerControllerReferenceURL加载UIImage

我正在使用UIImagePickerController来允许用户从图像库中选择一个图像。 然后我想在sqlite数据库中启动该文件的位置,以便稍后可以参考。

我一直在做一些谷歌搜索如何做到这一点,我很快就会出现。 我知道我可以通过调用delegate方法获取项目的ReferenceURL:

NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] 

这确实给了我一个有效的NSURL对象,如果我输出picURL.absoluteString,我可以看到这个文件的assets-library位置的有效URL。 但是,如果我尝试使用此url创建NSData对象,以便我可以依次创建UIImage,则代码将失败,因为NSData返回nil。 例如:

  NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] NSString *stringUrl = picURL.absoluteString; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]]; imgMain.image = [UIImage imageWithData:data] 

我意识到我在这里有点重复,但重点是获取我可以存储在sqlite中的URL的字符串表示,然后使用所述字符串创建一个图像(所以上面的代码代表了那个思路)。

我发现了一些关于使用ALAssetsLibrary的信息,但这给了我各种适合,因为它似乎不适合iOS 5和ARC。 我不断收到错误消息’Receiver type ALAsset for instance message是一个前向声明。 我可以在引用ALAsset / ALAssetsLibrary的文件上设置属性以忽略停止构建错误的ARC,但是一旦我离开代码块,数据就会消失。 见下文:

  NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; __block UIImage *returnValue = nil; [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) { returnValue = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; } failureBlock:^(NSError *error) { // error handling }]; [library release]; 

returnValue确实返回一个有效的图像,但是一旦代码退出resultBlock,数据的内容就会消失(即returnValue再次变为null)。

所以我的问题是:如何使用UIImagePickerControllerReferenceURL并将其转换为我可以存储在sqlite中的字符串,然后使用所述字符串在以后创建有效的UIImage对象?

看起来你在正确的轨道上,用于保存资产url。

 Save NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"] NSString *stringUrl = picURL.absoluteString; Reload AssetURL NSURL asssetURL = [NSURL URLWithString:stringUrl] 

至于稍后加载资产,我将基于你没有使用弧的假设。 这可以解释为什么你的returnValue是零。

您是否尝试过为结果添加保留? 例如:

  NSURL *referenceURL = [NSURL URLWithString:savedAssetURLString] ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; __block UIImage *returnValue = nil; [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) { returnValue = [[UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]] retain]; //Retain Added } failureBlock:^(NSError *error) { // error handling }]; [library release];