iPhone将图像保存到后台线程中的文档文件夹任务

时间:2012-08-17 08:55:23

标签: ios background camera xcode4.4 background-thread

我对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 ...方法中运行保存到文档代码时,同一行是有效的。有关如何解决此错误的任何想法?

提前致谢!

1 个答案:

答案 0 :(得分: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];

/* ...*/