最近在做保存多张图片到相册,以前的项目只是单张保存。使用多张以后会出图片缺失的情况。排查一下原因是保存相册的时候,我们循环保存,相册显示繁忙,所以个别几张图片没有保存过去。为了解决这个问题,我们可以使用递归去实现。就是成功一张再保存下一张。
-(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 saveNext];}
-(void) saveNext{
if (self.listOfImages.count > 0) {
UIImage *image = [self.listOfImages objectAtIndex:0];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
}
else {
NSLog(@"没有图片了");
}
}
-(void) savedPhotoImage:(UIImage*)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {
if (error) {
NSLog(@"%@", error.localizedDescription);
}
else {
[self.listOfImages removeObjectAtIndex:0];
[SSGOTools showInfoPopHint:@"保存成功"];
}
[self saveNext];
}
可以试一下,不会再出现丢图片的问题。但是新的问题来了。
首先9张图片以上的时候 非常慢。用户不知道你在干嘛。大部分用户都不会耐心等待。会选择再点击一次
第二个问题就是如果第一次写入相册没有完成还在递归函数中,第二次又要开始,但是相册不可能同时处理两张图片。会造成相册繁忙。那么就会造成递归函数的崩溃。程序也就崩溃了。所以想要更好解决。我们还要考虑多线程的方法去实现
参考下面博客,多线程保存图片到相册
https://blog.csdn.net/lee727n/article/details/80775190