2011-10-21 7 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

앱은 "runloop"을 실행합니다. 기본적으로 최상위 레벨 while-loop를 종료합니다. 루프를 반복 할 때마다 UI가 업데이트됩니다. UI를 변경하는 메서드를 호출하면 UI는 루프의 다음 반복 때까지 실제로 변경되지 않습니다. 따라서 저장 작업과 같은 장기 실행 명령을 실행하면 저장 작업이 완료 될 때까지 요청이 실행되지 않고 HUD의 목적을 무효화합니다.이 부분에 대해서는 http : // stackoverflow에서 좀 더 자세하게 설명합니다. co.kr/questions/7452925/threads-and-autoreleasepool-questions/7710576 # 7710576. – edsko

+1

오, performSelector는 "runloop의 다음 반복에서이 메소드를 호출하십시오."라고 말하면 HUD가 표시된 후에 실행할 것입니다. – edsko