http://www.99css.com/1425/
同一个问题(前一次是一年多前,写完就忘了)栽了两次,纪录一下。
症状
在循环语句中批量保存图片到相册时在低配置的设备中会有丢失的情况,代码一般是这个样子
for (int i = 0; i < n; i++) {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}
debug了一下,错误是
write busy
原因
iOS 往系统相册写照片的时候是单线程,一张存完才会存下一张,可能是因为要经过这几个过程:压缩图片、生成缩略图、SQLite保存数据,低配置的机器(比如 iPhone4)有点慢,同时写入照片会有失败的情况,我大 iPhone5 无压力
解决方法
知道原因后就好解决了,方法就是一张存成功再存下一张
先保存成数组
for (int i = 0; i < n; i++) {
UIImage *image = ...;
[listOfImages addObject:image];
}
再递归
-(void) saveNext{
if (listOfImages.count > 0) {
UIImage *image = [listOfImages objectAtIndex:0];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);
}
else {
[self allDone];
}
}
-(void) savedPhotoImage:(UIImage*)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {
if (error) {
//NSLog(@"%@", error.localizedDescription);
}
else {
[listOfImages removeObjectAtIndex:0];
}
[self saveNext];
}
之前看了一些开源的代码,里面有一个功能,就是将图片下载到相册,仔细看了其中的代码,只有很简单的一句话,并且保存过后,还可以判断是否保存成功。
如下代码所示,
点击按钮,将self.imageView上面的image内容保存到本地相册,并指定判断保存成功与否的方法imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:
- (IBAction)saveImageToAlbum:(id)sender {
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
}
实现imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:方法
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString *message = @"呵呵";
if (!error) {
message = @"成功保存到相册";
}else
{
message = [error description];
}
NSLog(@"message is %@",message);
}
这些代码很简单,如果没有错误的话就提示“成功保存到相册”,如果保存失败的话,那么就输出错误信息[error description]。