Загрузка UIImage из UIImagePickerControllerReferenceURL

Я использую UIImagePickerController, чтобы позволить пользователям выбирать изображение из библиотеки изображений. Затем я хочу указать местоположение этого файла в базе данных sqlite, чтобы я мог обратиться к нему позже.

Я занимался поиском того, как это сделать, и подхожу довольно коротко. Я знаю, что могу получить ReferenceURL элемента, вызвав внутри метода делегата:

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

Это действительно дает мне действительный объект NSURL, и если я вывожу picURL.absoluteString, я могу получить то, что кажется допустимым URL-адресом расположения библиотеки ресурсов файла. Однако, если я пытаюсь создать объект NSData с этим URL, чтобы я мог, в свою очередь, создать UIImage, код завершается ошибкой, потому что NSData возвращает nil. Например:

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

Я понимаю, что в данном случае я несколько повторяюсь, но смысл состоит в том, чтобы получить строковое представление URL, которое я могу сохранить в sqlite, а затем использовать указанную строку позже для создания изображения (поэтому приведенный выше код представляет этот ход мысли).

Я нашел некоторую информацию об использовании 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 в более позднее время?

 Steven Fisher16 июл. 2012 г., 22:57
Вы получили где-нибудь с этим?

Ответы на вопрос(1)

Решение Вопроса

Похоже, вы на правильном пути для сохранения URL ресурса.

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


Reload AssetURL
NSURL asssetURL = [NSURL URLWithString:stringUrl]

Что касается загрузки актива позже, я буду исходить из предположения, что вы не используете дугу. Что объясняет, почему вы возвращаете значение, равное нулю.

Вы пытались добавить сохранение к результату? например:

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

Ваш ответ на вопрос