Загрузка 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 в более позднее время?