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'는 것입니다. 이게 옳은 거니? 회 전자 디스플레이의 지연을 어떻게 해결합니까?
감사합니다. 명확히하기 위해,이 performSelector는 정확히 무엇을합니까? 감사! – Zhen
앱은 "runloop"을 실행합니다. 기본적으로 최상위 레벨 while-loop를 종료합니다. 루프를 반복 할 때마다 UI가 업데이트됩니다. UI를 변경하는 메서드를 호출하면 UI는 루프의 다음 반복 때까지 실제로 변경되지 않습니다. 따라서 저장 작업과 같은 장기 실행 명령을 실행하면 저장 작업이 완료 될 때까지 요청이 실행되지 않고 HUD의 목적을 무효화합니다.이 부분에 대해서는 http : // stackoverflow에서 좀 더 자세하게 설명합니다. co.kr/questions/7452925/threads-and-autoreleasepool-questions/7710576 # 7710576. – edsko
오, performSelector는 "runloop의 다음 반복에서이 메소드를 호출하십시오."라고 말하면 HUD가 표시된 후에 실행할 것입니다. – edsko