同一个问题(前一次是一年多前,写完就忘了)栽了两次,纪录一下。

症状

在循环语句中批量保存图片到相册时在低配置的设备中会有丢失的情况,代码一般是这个样子

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