이 질문은 이전에 질문되었지만 응답이 작동하지 않습니다. 나는 (내가 틀렸다면 나에게 맞다) 메인 쓰레드가 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 초가 걸리므로 너무 빨리 업데이트되는 것처럼 보이지 않습니다.
초보자
그렇지 않으면 여전히 메인 스레드를 차단합니다 : 훨씬 쉽기 때문
libdispatch 사용. 'performSelectorOnMainThread'는 이미 메인 쓰레드에 있다면 유용하지 않습니다. – Taum
ViewController.m에 있습니다. 메인 스레드입니까? – uti0mnia
progressBarPercentage가 IBAction 내부 또는 외부에서 선언 되었습니까? – Piyuesh