我已经设法通过剥离保存图像代码并将其移动到它自己的函数中使其工作,该函数在对象的数组上递归调用自身,如果它失败,它会将相同的图像重新解析回函数,直到它成功工作完成后将显示“完成”。因为我使用了 completedBlock: from 函数来完成循环,所以每次运行它只运行一个文件保存。
这是我递归使用的代码:
- (void)saveImage {
if(self.thisImage)
{
[self.library saveImage:self.thisImage toAlbum:@"Test Album" withCompletionBlock:^(NSError *error) {
if (error!=nil) {
[self saveImage];
}
else
{
[self.imageData removeObject:self.singleImageData];
NSLog(@"Success!");
self.singleImageData = [self.imageData lastObject];
self.thisImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.singleImageData]]];
[self saveImage];
}
}];
}
else
{
self.singleImageData = nil;
self.thisImage = nil;
self.imageData = nil;
self.images = nil;
NSLog(@"Done!");
}
}
为了设置它,我最初使用了一组 UIImages,但这使用了大量内存并且非常慢(我正在测试多达 400 张照片)。我发现一个更好的方法是将 URL 的 NSMutableArray 存储为 NSString,然后在函数中执行 NSData GET。
以下代码是使用数据设置 NSMutableArray 然后调用该函数的代码。它还将第一个 UIImage 设置到内存中并将其存储在 self.thisImage 下:
NSEnumerator *e = [allDataArray objectEnumerator];
NSDictionary *object;
while (object = [e nextObject]) {
NSArray *imagesArray = [object objectForKey:@"images"];
NSString *singleImage = [[imagesArray objectAtIndex:0] objectForKey:@"source"];
[self.imageData addObject:singleImage];
}
self.singleImageData = [self.imageData lastObject];
self.thisImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.singleImageData]]];
[self saveImage];
这意味着 UIImage 的其余 getter 可以包含在函数中,并且可以监视 UIImage 的单个实例。我还将原始 URL 记录到 self.singleImageData 中,以便我可以从数组中删除正确的元素以停止重复。
这些是我使用的变量:
self.images = [[NSMutableArray alloc] init];
self.thisImage = [[UIImage alloc] init];
self.imageData = [[NSMutableArray alloc] init];
self.singleImageData = [[NSString alloc] init];
这个答案应该适用于任何使用http://www.touch-code-magazine.com/ios5-saving-photos-in-custom-photo-album-category-for-download/的 iOS 6(在 iOS 6.1 上测试)并且应该导致所有图片都正确保存并且没有错误。