La aplicación que utiliza UIImagePickerController se congela cuando selecciona "Usar foto" después de tomar una foto

Estoy trabajando en una aplicación de captura de fotos y video simple ahora mismo. La aplicación permite con éxito que el usuario tome una foto o un video presionando un button. Sin embargo, tan pronto como termine de tomar su foto o video, le da 2 opciones: "Retake" y "Use Photo" o "Use Video", dependiendo de cuál esté usando.

Si el usuario toca "Retake", simplemente les permite volver a tomar una foto o video nuevo, pero cuando el usuario selecciona "Usar foto" o "Usar video", la pantalla se congela.

Si salgo de la aplicación congelada y miro mi rollo de camera, la foto que acabo de tomar usando la aplicación se ha guardado correctamente. Así que cuando tocas el button "Usar foto" se guarda con éxito en el rollo de la camera a pesar de que la pantalla de la aplicación se congela.

Una persona me dijo que "se congela porque lleva time save la foto y se está ejecutando en el hilo principal. Puedes usar ALAssetLibrary para solucionar el problema de congelación".

Sin embargo, no estoy familiarizado con ALAssetLibrary ni con la teoría de por qué sería útil en esta situación. Solo hojeé algunos de sus documentos y aún estoy perdido.

Cualquier ayuda sería muy apreciada.

Aquí está el código que tengo hasta ahora:

ViewController.h:

#import <UIKit/UIKit.h> @interface ViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> @property UIImagePickerController * pickerController; -(IBAction)showCameraUI; @end 

ViewController.m:

 #import "ViewController.h" #import <MobileCoreServices/MobileCoreServices.h> @interface ViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate> //The above are the 2 delegates requinetworking for creating a media capture/camera app. - (void)imagePickerController:pickerController didFinishPickingMediaWithInfo:(NSDictionary *)info; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; NSLog(@"%ld", (long)UIImagePickerControllerSourceTypeCamera); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)showCameraUI{ UIImagePickerController * pickerController = [[UIImagePickerController alloc]init]; pickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; pickerController.sourceType = UIImagePickerControllerSourceTypeCamera; pickerController.delegate = self; [self presentViewController:pickerController animated:YES completion:nil]; } - (void)imagePickerController:pickerController didFinishPickingMediaWithInfo:(NSDictionary *)info { // saves the photo you just took NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil); } } - (void)imagePickerControllerDidCancel:pickerController { [self dismissViewControllerAnimated:YES completion:nil]; } @end