2010-03-06 2 views
3

메인 스레드가 오랜 시간 작업을하는 동안 움직이는 회전 바퀴를 표시하는 방법이 있습니까? 애니메이션은 UIActivityIndicatorView를 만든 동일한 스레드에 의해 처리됩니다. 맞습니까? 그렇다면 여러 스레드에 속한 뷰가 동일한 뷰 계층 구조에있을 수 있습니까?메인 스레드가 통화 중일 때 UIActivityIndicatorView를 실행하십시오.

다른 모든 것은 실패합니다. 오랜 작업 자체를 백그라운드 스레드로 옮기지 않아도되지만, UI가 작동하는 동안 어떻게 든 멈춰야 할 것입니다. 내가 어떻게해야할지 모르겠다.

편집 : 1 세대 장치에서 "길이가 길다"는 약 2 초입니다.

답변

7

해결 방법은 긴 작업을 실행하기 전에 실행 루프를 통해 적어도 하나의 반복을 애니메이션을 시작하는 것입니다. 예를 들어 :

[activity startAnimating]; 
[self performSelector:@selector(lengthyOperation) withObject:nil afterDelay:0]; 

당신은 performSelector 방법을 사용 나중에 그렇게 작동 표시등이 당신이 바쁜 도착하기 전에 애니메이션을 시작하는 기회를 실행할 수있는 방법을 설정하는 단지 몇 가지 방법이 없습니다.

+0

지옥, 나는 가까웠다. performSelectorOnMainThread를 시도했지만, 지연이 중요한 것처럼 보였다. –

+2

@Seva 메인 스레드에서 오랜 시간 동안 작동하는 것은 일반적으로 좋지 않습니다. – Giao

+0

Giao가 말하는 것은 사실입니다. 그러나 응용 프로그램이 발생하는 동안 일시 중지하려면 응용 프로그램이 이상한 아이디어처럼 보이지 않습니다. 그러나 더 나은 해결책은 작업이 끝나면 [[UIApplication sharedApplication] beginIgnoringInteractionEvents] 및 endIgnoringInteractionEvents를 사용하는 것입니다. –

5

올바른 대답은 확실히 길이가 긴 작업을 백그라운드 스레드로 옮기고 작업이 끝나면 주 스레드와 통신하도록하는 것입니다. 이를 수행하는 방법을 모르는 경우 NSOperationQueueNSInvocationOperation을 읽으십시오. 귀하의 앱과 사용자는 배우기 위해 필요한 최소한의 시간 동안 당신에게 감사 할 것입니다.

관련 문제