1

我对 iOS 编程很陌生。我一直在开发一个非常简单的相机应用程序,但我需要完成的一个主要功能是不仅要显示使用内置相机拍摄的图像或使用 UIImageView 从 iPhone 画廊中挑选的图像,还要将其保存到文档文件夹,以便稍后在第二个视图控制器中调用它。我已经设法使用以下代码完成了这一点:

    //Save taken image to Camera Roll and display on UIImageView
    -(void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info{

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

[self dismissModalViewControllerAnimated:YES];


if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {


    UIImage *image = [info 
                      objectForKey:UIImagePickerControllerOriginalImage];


    imageView.image = image;
    imageView.hidden = NO;

    if (newMedia)
        UIImageWriteToSavedPhotosAlbum(image, 
                                       self,
                                       @selector(image:finishedSavingWithError:contextInfo:),
                                       nil);
}
    //Save photo to documents folder
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"savedImage.png"];
UIImage *image = imageView.image; // imageView is my image from camera
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:savedImagePath atomically:NO];
}}

我遇到的问题是将图像保存到文档文件夹的过程需要很长时间(> 5 秒!),以至于用户会认为应用程序挂起。当然我想显示一个活动指示器,但现在知道这是不可能的,因为保存到文档文件夹任务占用了我的主线程,因此阻止任何其他 UIView 任务执行,直到保存完成。

似乎解决方案正在将保存到文档任务转移到后台线程,但目前我无法完全理解如何做到这一点。有谁知道我可以添加到上述代码中以将此任务移至后台的一些简单代码?或者也许有人可以向我推荐一个很好的教程?

编辑:

这是我尝试过的其他东西。我已经设置了 @jake_hetfield 的 saveImage 方法,并将保存到文档的代码放在里面,如下所示:

    - (void)saveImage:(UIImage*)image {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,        
    NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory       
    stringByAppendingPathComponent:@"savedImage.png"];
    UIImage *image = imageView.image; // imageView is my image from camera
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:NO];

    [self performSelectorInBackground:@selector(saveImage:) withObject:image]; }

但是这行 UIImage *image = imageView.image; 突然返回构建错误“重新定义图像”。这令人困惑,因为当我在 PickerDidFinish... 方法中运行保存到文档代码时,同一行有效。关于如何解决此错误的任何想法?

提前致谢!

4

1 回答 1

0

创建一个保存图像的方法,然后使用 performSelectorInBackground 调用它,它将在后台运行。

例子:

- (void)saveImage:(UIImage*)image{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // Code for saving image here    

    [pool release];
}

像这样称呼它:

/* ... */

[self performSelectorInBackground:@selector(saveImage:) withObject:imageView.image];

/* ...*/
于 2012-08-17T09:29:51.400 回答