7
votes

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
have a look at this questionAwais Fayyaz
@Mr. Bean how about other two images saved status? do you have error trace? did you receive all 10 files data thru your network but its failed to save into the photo gallery or just 2 failed among 10 occasionally ? Sorry for lot of questions but we have to meet different scenarios in image processing.Sathish

2 Answers

2
votes

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"];
});
}
}];
}
2
votes

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);
}];
}