Tuesday, August 28, 2018

Multiple images not getting saved in Photo Library by using UIActivityViewController

Leave a Comment

I need to save multiple images in the photo library, the user can multiple selects the images from the app gallery then can save them in iPhone Photo Gallery. I am showing the UIActivityViewController for the purpose.

Suppose a user selects 10 or more images and choose to save them into photo library then only 7-8 images are saved.

Is there any way by which i can save array of images in the photo library without any failure ?

Thanks

let images = Generic.fetchImagesFromMediaFiles(self.selectedMediaObj) // to fetch selected images  let activityViewController = UIActivityViewController(activityItems: images, applicationActivities: nil) self.present(activityViewController, animated: true, completion: nil);  if let popoverPresentationController = activityViewController.popoverPresentationController {     popoverPresentationController.sourceView = self.shareAllView } 

2 Answers

Answers 1

iOS system write photo save to album use single thread, one by one to do. if you want to save more photos same time, it maybe loss some data.

-(void)saveBtn { [SSGOTools againRequestPhotoWithblock:^(BOOL isAgree) { if (isAgree) {  self.listOfImages = [NSMutableArray new]; int photoNum ; photoNum = (int)_photoArray.count; if (_photoArray.count > 9) { photoNum = 9; } for (int i = 0; i < photoNum; i++) { NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:_photoArray[i]]]; UIImage *myImage = [UIImage imageWithData:data]; //[self.listOfImages addObject:myImage]; [self loadImageFinished:myImage];  } } }]; }  - (void)loadImageFinished:(UIImage *)image { [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{  //write photo save to album  [PHAssetChangeRequest creationRequestForAssetFromImage:image];  } completionHandler:^(BOOL success, NSError * _Nullable error) {  NSLog(@"success = %d, error = %@", success, error); if(success){ dispatch_async(dispatch_get_main_queue(), ^{ [SSGOTools showInfoPopHint:@"Success"]; }); } }]; } 

Answers 2

you will need to use the completion block here for ensuring all images are saved.. try this :

-(void)saveBtn{ [SSGOTools againRequestPhotoWithblock:^(BOOL isAgree) {     if (isAgree) {         self.listOfImages = [NSMutableArray new];         int photoNum ;         photoNum = (int)_photoArray.count;         if (_photoArray.count > 9) {             photoNum = 9;         }         for (int i = 0; i < photoNum; i++) {             NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:_photoArray[i]]];             UIImage *myImage = [UIImage imageWithData:data];             [self.listOfImages addObject:myImage];            // [self loadImageFinished:myImage];         }        [self saveAllImages:self.listOfImages];     } }]; } -(void)saveAllImages:(NSMutableArray *)images { UIImage *image = [images firstObject]; [images removeObject:image];  [self loadImageFinished:image :^(bool success) {      if (success){          if (images.count > 0){             [self saveAllImages:images];         }else{             // all images saved do whatever you want;         }      }else{         NSLog(@"failed saving image");     }  }]; } - (void)loadImageFinished:(UIImage *)image :(void(^)(bool success))completion{ [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{      //write photo save to album      [PHAssetChangeRequest creationRequestForAssetFromImage:image];  } completionHandler:^(BOOL success, NSError * _Nullable error) {      NSLog(@"success = %d, error = %@", success, error);     if(success){         dispatch_async(dispatch_get_main_queue(), ^{             [SSGOTools showInfoPopHint:@"Success"];         });     }     completion(success); }]; } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment