Я отправляю этот вопрос как продолжение следующей темы, которую я опубликовал ранее.Сохранение и загрузка изображений с использованием ALAssetLibrary
Я собираю изображение и видео в приложении ios и сохраняю его в рулоне камеры (требование клиента). Тем не менее, чтобы просмотреть захваченные изображения/видео, я сохраняю значение assetURL в основных данных как String.
Моя экономия код выглядит следующим образом:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *cameraMedia = [info objectForKey:UIImagePickerControllerOriginalImage ];
NSDictionary* metaData = [info objectForKey:UIImagePickerControllerMediaMetadata];
NSString* mediaType = [info objectForKey: UIImagePickerControllerMediaType];
NSURL* mediaUrl = (NSURL*)[info valueForKey:UIImagePickerControllerMediaURL];
ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];
//For now we are saving image capture time from here
//In future we may need to load the time from image metaData
NSDate *captureTime = [[NSDate alloc] init];
//completion blocks
ALAssetsLibraryWriteImageCompletionBlock imageCompletionBlock = ^(NSURL* imgURL, NSError* error){
if (error == nil) {
NSLog(@"Asset URL %@", imgURL);
[self saveEvidence:imgURL mediaType:mediaType withDate:captureTime];
} else {
UIAlertView *alertView =
[[UIAlertView alloc] initWithTitle:@"Failed to save image to device!"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:Nil];
[alertView show];
}
};
ALAssetsLibraryWriteVideoCompletionBlock videoCompletionBlock = ^(NSURL* videoURL, NSError* error){
if(error == nil)
{
NSLog(@"Asset URL %@", videoURL);
[self saveEvidence:videoURL mediaType:mediaType withDate:captureTime];
}else
{
UIAlertView *alertView =
[[UIAlertView alloc] initWithTitle:@"Failed to save video to device!"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:Nil];
[alertView show];
}
};
if(CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo){
[al writeImageToSavedPhotosAlbum:[cameraMedia CGImage] metadata:metaData completionBlock: imageCompletionBlock];
}else if(CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie , 0) == kCFCompareEqualTo){
[al writeVideoAtPathToSavedPhotosAlbum:mediaUrl completionBlock:videoCompletionBlock];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
В saveEvidence, я сохранение URL в моей основной сущности данных. Теперь я загрузке мой образ следующим образом:
-(void)loadThumbNail:(NSString*) mediaURL{
NSLog(@"image URL String: %@", mediaURL);
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset)
{
NSLog(@"in result block");
//self.thumbNailImage = [UIImage imageWithCGImage:[asset thumbnail]];
ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
self.thumbNailImage = [UIImage imageWithCGImage:iref];
}
};
//
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error)
{
NSLog(@"Cant load image - %@",[error localizedDescription]);
};
if(mediaURL && [mediaURL length])
{
self.thumbNailImage = nil;
NSURL *asseturl = [NSURL URLWithString:mediaURL];
NSLog(@"image URL: %@", asseturl);
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:asseturl
resultBlock:resultblock
failureBlock:failureblock];
}
}
Сначала я пытался загрузить миниатюрное изображение с помощью: self.thumbNailImage = [UIImage imageWithCGImage: [эскиз активов]]; Но изображение остается нулевым, то есть не загружается. Затем я попробовал загрузить fullResolutionImage. Тем не менее, изображение равно нулю.
Любое решение?
, если вы по-прежнему сталкивается с какой-либо проблемой, пожалуйста, обновите здесь ... –
Я думаю, что мой метод работает. Возможно, проблема связана с загрузкой асинхронного изображения. Я получаю ненулевое изображение ref в блоке результата, но в cellForItemAtIndexPath, при загрузке изображения в виде изображения ячейки я получаю нуль. Вот мой заказ звонка, [self loadThumbNail: evidence.url]; [cell.imageThumNailView setImage: self.thumbNailImage]; После некоторого дальнейшего исследования я обнаружил, что назначение изображения в ячейку вызывает вызов перед вызовом загрузки изображения. – Pixelord