1

私はiOSプログラミングにまったく慣れていません。私は非常に単純なカメラアプリに取り組んできましたが、達成する必要がある主要な機能の 1 つは、内蔵カメラで撮影した画像や、UIImageView を使用して iPhone ギャラリーから選択した画像を表示するだけでなく、それをドキュメント フォルダーに保存して、後で 2 番目のビュー コントローラーで呼び出すことができるようにします。これは、次のコードで達成できました。

    //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 に答える