繁体   English   中英

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

[英]iPhone Save image to documents folder task in 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];
}}

我遇到的问题是,将图像保存到documents文件夹的过程花费了很长时间(> 5sec!),以至于用户会认为该应用程序已挂起。 当然,我想显示一个活动指示器,但是现在知道这是不可能的,因为“保存到文档”​​文件夹任务正在占用我的主线程,从而阻止了其他任何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 ...方法中运行“保存到文档”​​代码时,同一行有效。 关于如何解决此错误的任何想法?

提前致谢!

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

例:

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

    // Code for saving image here    

    [pool release];
}

这样称呼它:

/* ... */

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

/* ...*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM