如何强制UIImageWriteToSavedPhotosAlbum同步(刷新)缓冲区?

时间:2009-09-17 19:33:02

标签: iphone image-processing

我正在为想要在iTunes上销售他的作品的艺术家编写一个简单的应用程序。 因为只有十二个图像可以比从图像选择器中选择的图像更快地删除,所以用户不会单独选择图像。相反,图像以编程方式从应用程序包复制到照片库中。这样可以最大限度地减少应用程序的大小和复杂性,并使最终用户免于单独选择每个图像的乏味。

注意:此问题仅出现在物理设备(iPhone 3Gs / 3.1)上。

毫不奇怪,我的实现涉及在循环内调用UIImageWriteToSavedPhotosAlbum,循环遍历12个完整路径的数组到相应的图像文件(都是JPEG)。减去细节(例如,错误检查,日志记录,可选回调参数), 循环归结为:

for ( NSString* path in paths ) {
    image = [UIImage imageWithContentsOfFile:path];
    if (image) {
        [NSThread sleepForTimeInterval:1.0]; // unacceptable
        UIImageWriteToSavedPhotosAlbum(image, ...);
    }
}

请注意标记为“不可接受”的行。为什么当前线程必须在每次调用UIImageWriteToSavedPhotosAlbum(图像,...)之前休眠一整秒?那么,因为iPhone OS 3.1(在我的3Gs设备上运行)需要多长时间来实现将缓冲的UIImage对象实际写入代表用户照片库的持久存储的业务!我怎么知道这个?好吧,因为没有调用NSThread sleepForTimeInterval:,所以没有报告任何类型的错误,即使12个图像中只有一小部分(看起来在1到9之间随机变化)实际上被复制到照片库中。此外,随着睡眠间隔的增加,结果确实会有所改善,但正如我所发现的那样,在改善变得明显之前,必须大大增加间隔。即使在0.8秒的高值,我也观察到重复试验后丢失的文件。在1秒钟内,我观察了多达三次连续的“正确”运行,其中所有文件都完全转移,然后失去了所有的耐心。

我已经用Google搜索了这个问题,检查了这个提到UIImageWriteToSavedPhotosAlbum的每个帖子,并且没有发现任何内容。我是世界上唯一一个在循环中调用过该函数的人吗?有什么理由说明为什么我不应该这样做是不言而喻的?

2 个答案:

答案 0 :(得分:1)

面对同样的问题,我找到了解决问题的方法。 当您致电UIImageWriteToSavedPhotosAlbum时,您可以将完成选择器作为参数传递。
因此无需在循环中调用UIImageWriteToSavedPhotosAlbum。当第一次调用完全保存(调用完成方法)时,继续。使用一些计数器来控制过程。

这是我的代码:

-(IBAction) SaveAllPictures {
            UIImage *the_image;
            if (images_to_photos_album < numberOfPhotos) {
                the_image= [UIImage //get your image here] 
                UIImageWriteToSavedPhotosAlbum(the_image, self, @selector(imageSaved: error: context:), the_image);
            }

            if (images_to_photos_album == numberOfPhotos) {
                the_image= [UIImage //get your image here
                UIImageWriteToSavedPhotosAlbum(the_image, self, @selector(image: didFinishSavingWithError: contextInfo:), the_image);
            }


        }


    -(void) imageSaved: (UIImage *) image error:(NSError *) error context: (void *) contextInfo {

        NSLog(@"image saved, error = %@",error);
        if (!error) {
            images_to_photos_album = images_to_photos_album+1;
            [self SaveAllPictures];
        } else { 
             //handle error here
        }

    }


- (void) image: (UIImage *)image didFinishSavingWithError: (NSError *)error contextInfo: (void *)contextInfo {


    images_to_photos_album =0;

    if (error) {
        // handle error here
    } else {
               // handle success here
    }

}

答案 1 :(得分:-1)

快速搜索Apple的开发人员论坛,发现了以下帖子:

完整主题

https://devforums.apple.com/message/112119#112119

这个帖子告诉我,没有安全的方法可以编程方式将图像写入照片库。