2012-06-12 4 views
6

私はUIImagePickerControllerを使用して、ユーザーが画像ライブラリから画像を選択できるようにしています。私はその後、sqliteデータベースでそのファイルの場所を開始したいので、後で参照することができます。UIImagePickerControllerReferenceURLからUIImageをロードする

私はこれを行う方法についていくつかの検索を行ってきましたが、私はかなり短くなっています。

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

はこれが私に有効なNSURLオブジェクトを与えず、I出力picURL.absoluteString場合、私はに有効なURLのように見えることができるもの:私は、私は、デリゲートメソッド内で呼び出すことで、アイテムのReferenceURLを得ることができます知っていますassets-libraryファイルの場所。しかし、この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でうまく動作しないように見えるため、あらゆる種類のフィット感がありました。私はエラーメッセージを受信し続ける '受信者の種類ALAssetインスタンスメッセージは前方宣言です。 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が再びゼロになります)。

私の質問は:私はUIImagePickerControllerReferenceURLを使用して、それをsqliteに格納して、後で有効なUIImageオブジェクトを作成するために使用できる文字列に変換しますか?

+0

どこにいらっしゃいましたか? –

答えて

9

アセットURLを保存するために正しいトラックのように見えます。

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


Reload AssetURL 
NSURL asssetURL = [NSURL URLWithString:stringUrl] 

資産を後で読み込む際は、アークを使用していないという前提に基づいています。なぜあなたはreturnValueがnilであるのか説明します。

結果にretainを追加しようとしましたか?たとえば:

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