私は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... メソッドでドキュメントへの保存コードを実行したときに同じ行が機能するため、これは紛らわしいです。このエラーを修正する方法はありますか?
前もって感謝します!