2014-01-29 5 views
0

이 질문은 이전에 질문되었지만 응답이 작동하지 않습니다. 나는 (내가 틀렸다면 나에게 맞다) 메인 쓰레드가 UI를 업데이트한다는 것을 안다. 따라서 루프의 메인 쓰레드를 호출 할 필요가있다. 나는이 노력하고있어 및 진행률 표시 줄 루프의 끝 부분 만 업데이트루프에서 UIProgressBar가 업데이트되지 않았습니다.

여기

이 내 코드

.H

@interface ViewController : UIViewController <UITextFieldDelegate> { 
IBOutlet UIProgressView *progressBar; 
float progressBarPercentage; 
} 
-(IBAction)button:(id)sender; 

@end 

하는 .m (그래서 0 %에서 100 %로 이동) `

01 :이 라인 [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:NO]; 그냥 1makeMyProgressBarMove로 이동하지 않고 루프를 다시 시작에 도달 할 때

-(IBAction)button:(id)sender{ 

for (int z=0; z < 9; z++){ 

//do stuff 

float progressBarPercentage = (1.0/9.0 * (z + 1)); 
     [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:NO]; 

} 

} 

-(void)makeMyProgressBarMove{ 

    [progressBar setProgress:progressBarPercentage animated:YES]; 
    } 

디버그 모드에서 실행, 나는 나타났습니다

또한 //do stuff 부분이 짧지는 않습니다. 버튼을 누를 때 코드를 실행하는 데 실제로 5 초가 걸리므로 너무 빨리 업데이트되는 것처럼 보이지 않습니다.

초보자

+1

그렇지 않으면 여전히 메인 스레드를 차단합니다 : 훨씬 쉽기 때문

libdispatch 사용. 'performSelectorOnMainThread'는 이미 메인 쓰레드에 있다면 유용하지 않습니다. – Taum

+0

ViewController.m에 있습니다. 메인 스레드입니까? – uti0mnia

+0

progressBarPercentage가 IBAction 내부 또는 외부에서 선언 되었습니까? – Piyuesh

답변

0
또한 다른 스레드에 "할 일 물건을"필요

, 그렇지 않으면 여전히 주 스레드를 차단합니다. performSelectorOnMainThread은 이미 메인 스레드에 있다면 유용하지 않습니다. 또한 다른 스레드에 "할 일 물건을"필요

-(IBAction)button:(id)sender{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     for (int z=0; z < 9; z++) 
     { 
      //do stuff 

      float progressBarPercentage = (1.0/9.0 * (z + 1)); 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [progressBar setProgress:progressBarPercentage animated:YES]; 
      }); 
     } 
    }); 
} 
+0

있다 어떤 ")"실종? 오류가 발생했습니다 – uti0mnia

+0

예, 죄송합니다. 그것은 고쳐야한다! – Taum

+0

좋아요, 이걸 시도해 볼게요 – uti0mnia

0

지금 시도 난 아직도 해요, 감사합니다, 그냥 자세한 정보가 필요한 경우 알려 주시기이

-(IBAction)button:(id)sender{ 

    for (int z=0; z < 9; z++){ 

    //do stuff 

    float progressBarPercentage = (1.0/9.0 * (z + 1)); 
      [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:YES]; 

    } 

    } 

    -(void)makeMyProgressBarMove{ 

     [progressBar setProgress:progressBarPercentage animated:YES]; 
     } 
+0

나는 그것을 시도했다, 그것은 똑같은 일을했다 : ( – uti0mnia

+0

난 그냥 디버거를 확인하고'makeMyProgreeBarMove :'메서드로 이동하지만 아직 progressbar를 업데이 트하지 않습니다 – uti0mnia