Загрузка 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 действительно возвращает действительное изображение, но как только код выходит из блока результатов, содержимое данных исчезает (т. е. returnValue снова становится нулевым).

Итак, мой вопрос: как мне использовать UIImagePickerControllerReferenceURL и преобразовать его в строку, которую я могу сохранить в sqlite, а затем использовать указанную строку для создания действительного объекта UIImage позже?

6
задан Shane McGarry 12 June 2012 в 02:16
поделиться