2012-06-12 71 views
6

我正在使用UIImagePickerController來允許用戶從圖像庫中選擇圖像。然後我想在sqlite數據庫中啓動該文件的位置,以便稍後參考它。從UIImagePickerControllerReferenceURL加載UIImage

我一直在做一些關於如何做到這一點的谷歌搜索,我來了很短。我知道我可以通過委託方法調用裏面獲得該項目的ReferenceURL:

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

這確實給我一個有效的NSURL對象,如果我輸出picURL.absoluteString我這似乎是一個有效的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好。我不斷收到錯誤消息'接收器類型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

看起來您正處於正確的軌道上,用於保存資產網址。至於後來加載資產,我將基於你沒有使用弧的假設。這將解釋你爲什麼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];