2011-10-21 3 views
0

こんにちは私は以下のコードスニペットに示すように 'ライブラリに画像を保存'機能を実装しています。基本的に、写真の保存は、ユーザーがページ上の画像に触れるとトリガーされます。同期で、HUDのスピナーを表示からプロセスをロック:ライブラリに画像を保存するときにHUD Spinnerが表示されない

TouchImageView *tiv = [[TouchImageView alloc]initWithFrame:blockFrame]; 
     [tiv setCompletionHandler:^(NSString *imageUrl){ 
      //Spinner should start after user clicks on an image 
      MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; 
      hud.labelText = @"Saving photo to library"; 

      //trigger method to save image to library 
      [self saveImageToLibrary]; 

     }]; 


-(void) saveImageToLibrary 
{ 
    //convert url to uiimage 
    UIImage *selectedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]]; 

    //Save image to album 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    // Request to save the image to camera roll 
    [library writeImageToSavedPhotosAlbum:[selectedImage CGImage] orientation:(ALAssetOrientation)[selectedImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){ 

     [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES]; 

     if (error) { 
      NSLog(@"error"); 
     } else { 
      NSLog(@"url %@", assetURL); 
      //Trigger get photo from library function 
      self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
      [self presentModalViewController:self.imgPicker animated:YES]; 

     } 

    }]; 
    [library release];  
} 

問題がHUDスピナーは、(3-4秒の遅延時間後)に表示されていないということです、私の疑惑は、「writeImageToSavedPhotosAlbum」のことです。これは正しいですか?スピナーの表示の遅れを解決するにはどうすればよいですか?

答えて

2

はい、正しいです。 HUDは、あなたが保存する前に自分自身を表示する機会を得るように

[self performSelector:@selector(saveImageToLibrary) withObject:nil afterDelay:0]; 

によってコール

[self saveImageToLibrary]; 

を交換してください。

+0

ありがとうございます!明確にするために、これはperformSelectorが正確に何をするのでしょうか?ありがとう! – Zhen

+2

あなたのアプリは基本的に最高レベルの決して終わらないwhileループである "runloop"を実行します。ループの各反復の開始時に、UIが更新されます。 UIを変更するメソッドを呼び出すと、UIのループは実際にはループの次の反復まで変更されません。だから、あなたの保存操作のような長時間実行すると、保存操作が完了するまでリクエストが実行されず、HUDの目的を破ります。これについてはhttp:// stackoverflowで詳しく説明します。 com/questions/7452925/threads-and-autoreleasepool-questions/7710576#7710576。 – edsko

+1

ああ、performSelectorはこう言っています: "runloopの次の反復でこのメソッドを呼び出す" - HUDが表示された後に実行されるようにします。 – edsko

関連する問題