使用UIActivityViewController保存到照片库中的多个图片未能成功保存。

7

我需要将多个图片保存到相片库中,用户可以从应用程序画廊中选择多张图片,然后可以将它们保存在iPhone相册中。我使用UIActivityViewController来实现这一目的。

假设用户选择了10张或更多的图片并选择将它们保存到相片库中,那么只有7-8张图片被保存。

有没有办法将图像数组保存到相片库中而不会出现任何故障?

谢谢。

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
}

请查看这个问题。 - Awais Fayyaz
@Mr. Bean,其他两张图片的保存状态如何?您有错误跟踪吗?您是否通过网络接收了所有10个文件的数据,但无法保存到照片库中,或者只是偶尔出现了2个失败?很抱歉问了这么多问题,但我们必须满足不同的图像处理场景。 - Sathish
2个回答

2

iOS系统写入照片保存到相册使用单个线程,一个接一个地执行。 如果您想同时保存更多的照片,可能会丢失一些数据。

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

这是正确的,但是是否有可能一次保存图像数组而且在此过程中不会丢失任何图像? - Mr. Bean

2

在这里,您需要使用完成块来确保所有图像都已保存。请尝试以下操作:

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

我需要从UIActivityViewController保存图像,我不认为这个答案会解决问题。顺便问一下,SSGOTools是什么? - Mr. Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接