2015-07-29 9 views
9

La mia app si arresta ogni volta che provo a salvare l'immagine utilizzando Photo Framework.Salvare l'immagine nella libreria fotografica utilizzando la struttura fotografica

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 

     _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; 

     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 

     _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; 

     } completionHandler:^(BOOL success, NSError *error) { 

      if (success) { 

       PHObjectPlaceholder *assetPlaceholder = _mChangeRequest.placeholderForCreatedAsset; 
      } 
      else { 

      NSLog(@"write error : %@",error); 
      } 
    }]; 
} 

crash : NSInternalInconsistencyException', reason: 'This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]' 

risposta

34

Tutto ciò che devi fare è attivare una richiesta di creazione. Come dice l'errore, puoi accedere alla richiesta di modifica solo all'interno del blocco performChanges.

Quindi, per salvare l'immagine si farebbe qualcosa di simile:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; 
} completionHandler:^(BOOL success, NSError *error) { 
    if (success) { 
     NSLog(@"Success"); 
    } 
    else { 
     NSLog(@"write error : %@",error); 
    } 
}]; 

In caso di necessità di fare qualcosa con il segnaposto del bene appena creato, è possibile accedere all'interno della stessa performChanges blocco:

PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; 
PHObjectPlaceholder *assetPlaceholder = changeRequest.placeholderForCreatedAsset; 
+0

mi ha risparmiato ore di lavoro! – TonyTony

+0

e quindi come ottenere l'URL di quell'immagine –

2
  1. eliminare terza riga del codice
  2. Verificare che il _mChangeRequest è __block variabile
  3. compilare ed eseguire

vedrete che l'immagine nella foto app

cambierai codice probabilmente come questo ...

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 

    __block PHAssetChangeRequest *_mChangeRequest = nil; 

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 

    _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]]; 

    } completionHandler:^(BOOL success, NSError *error) { 

     if (success) { 

      PHObjectPlaceholder *assetPlaceholder = _mChangeRequest.placeholderForCreatedAsset; 
     } 
     else { 

     NSLog(@"write error : %@",error); 
     } 
}]; 
} 
2

In Swift 3 Faccio questo per salvare il video nella libreria.

 if mediaType.isEqual(to: (kUTTypeMovie as NSString) as String) { 
      if let videoURL = info[UIImagePickerControllerMediaURL] as? URL { 

      PHPhotoLibrary.shared().performChanges({ 
       _ = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL) 
      }, completionHandler: { (success, error) in 
       if success { 
        print("ok") 
        let videoData = NSData(contentsOf: videoURL) 
        // use videoData here if needed... 
        if let posterImage = self.firstFrame(videoURL: videoURL) { 
         self.imageView.image = posterImage 
        } 
        picker.dismiss(animated: true) {() -> Void in 

        } 
       } 
       else { 
        print(error?.localizedDescription) 
       } 
      }) 
     } 
    } 
2

Ecco un esempio di codice di come si può scrivere/salvare l'immagine a Photo Library utilizzando UIImageWriteToSavedPhotosAlbum funzione:

- (void)saveImage:(UIImage *)image { 
    UIImageWriteToSavedPhotosAlbum(self.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); 
} 
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo; 
{ 
    if (!error) { 
     // saved successfully 

     PHFetchOptions *fetchOptions = [PHFetchOptions new]; 
     fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; 
     PHAsset *asset = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions].firstObject; 
     if (asset != nil) { 
      // here you can use asset of your image 
     } 
    } else { 
     NSLog(@"save image error: %@", error); 
    } 
} 

Non dimenticare di aggiungere nella vostra Info.plist una coppia chiave-valore Privacy - Camera Usage Description con descrizione dell'uso.

Problemi correlati