2009-08-07 8 views
2

긴 리소스로드 프로세스 중에 UIView에있는 UIProgressView 진행률 표시 줄을 업데이트하려고합니다. NIB 파일 (예 : 100 개)에서 여러 비트 맵을로드한다고 가정 해 보겠습니다. 내가 10을로드 한 후, 이미 표시되고있는 UIView의 일부인 UIProgressView에 .progress를 발행합니다. 그래서, 발행 :내 응용 프로그램이 리소스를로드하는 동안 UIProgressView가 업데이트되지 않습니다.

myView.myProgressView.progress=0.2; 

그럼, 또 다른 10 비트 맵을로드하고 문제 : 응용 프로그램이 실행, 진행 표시 줄이

myView.myProgressView.progress=0.4; 

등 등이 진행되지 않는 경우. 그것은 단순히 초기 위치에 머물러 있습니다. 완전한 바보 같은 소리가 날 위험이 있으므로 OS가 UI를 업데이트 할 수 있도록 별도의 스레드에 내 리소스를로드해야합니까? 아니면 더 쉬운 방법이 있습니까? 도움을 주셔서 감사합니다.

답변

1

예. 별도의 스레드에로드하십시오. 아니면 그냥 performSelector 같은 것을 사용

[self performSelector:@selector(setProgressBar) withObject:nil afterDelay:0.0]; 

을 (그리고 UI를 멤버 변수의 현재 값을 읽고 업데이트하는 setProgressBar 기능 만들기) 당신의 각 업데이트 후 runloop의 단계를 실행할 수

+0

안녕하세요, Marcc, 나는 당신의 performSelector 접근 방식을 시도하지 않았습니다. setProgressBar 메서드는 다른 모든 코드가 완료된 후에 호출되었습니다. 나는 UIProgressView를 업데이트하려고 시도조차하지 않았다. NSLog를 setProgressBar에 넣으면 콘솔에 다른 모든 리소스 로딩 메소드가 나온 후에 나온 것입니다. 다른 제안? 다른 스레드에서이 모든 작업을 수행하는 데 대한 참조를 가르쳐 주시겠습니까? – kspeacock

+1

죄송합니다. 그래서 아이디어가 옳다. 한 스레드에서 데이터를 업데이트하고 주 스레드 (UI 스레드)를 차단하지 않아야한다. 이 방법을 사용하면 performSelectorOnMainThread를 실제로 사용해야한다고 생각합니다 (이 사이트의 개발자 사이트에서 문서를 검색하십시오). – marcc

0

을 인터페이스 :

SInt32 result; 
do { 
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE); 
} while(result == kCFRunLoopRunHandledSource); 

그것은 (이들이 실행되어야하기 전에 이러한 viewDidAppear 같은 뷰 컨트롤러의 대리자를 상기 UI와 상호 작용하는 사용자를 활성화 실행 예 등) 다른 나쁜 영향을 미칠 수있는 정도로 매우 될 V 에리 조심해.

관련 문제