2010-12-19 7 views
2

인터넷에서 데이터를 구문 분석하는 동안 회전 작동 표시기 (UIActivityIndicatorView)를 내 앱에 추가하려고합니다. IB에있는 UIActivityIndicatorView에 연결된 IBOutlet (회 전자)이 있습니다. 처음에는 다음과 같이 설정했습니다 :활동 표시기가 회전하지 않습니다.

- 

(void) function { 
     self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite]; 
self.spinner.hidesWhenStopped = YES; 
[spinner startAnimating]; 
//parse data from internet 
[spinner stopAnimating];} 

하지만 회 전자는 회전하지 않습니다. 나는 그것이 같은 스레드에있는 모든 것과 관련이 있다는 것을 읽었습니다. 그래서 이것을 시도 :

- (void) newFunction { 
     self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite]; 
self.spinner.hidesWhenStopped = YES; 
[spinner startAnimating]; 
[NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil]; 
[spinner stopAnimating];} 

하지만 여전히 행운. 어떤 아이디어? 감사.

답변

8

귀하의 newFunction: 방법은 다음과 같아야합니다

- (void) newFunction { 
    self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
    self.spinner.hidesWhenStopped = YES; 
    [NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil]; 
} 

그리고 당신의 function 방법을 다음과 같이한다 : 당신이 당신의 코드를 대체 호야 다시 표시를 intitialize 안

- (void) function { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self.spinner performSelectorOnMainThread:@selector(startAnimating) withObject:nil waitUntilDone:NO]; 

    //... 

    [self.spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO]; 
    [pool drain]; 
} 
+1

+ 1 정답은 주 스레드에서 시작한 직후에 애니메이션을 멈추기 때문에 그가 아무 것도 보지 못하는 이유가 있다는 추가 정보가 있습니다. performSelectorOnMainThread : withObject : waitUntilDone :을해야하는 이유는 모든 UI 관련 활동이 주 ​​스레드에서 발생하기 때문입니다. 그러나 스피너의 시작/중지는 다른 스레드 내에서 발생해야합니다. – jer

0

.

-(void) function { 
    [spinner startAnimating]; 
    [self performSelector:@selector(newfunction) withObject:nil afterDelay:3.0]; 
} 
- (void) newfunction { 
    [spinner stopAnimating]; 
} 

감사합니다.

0

"인터넷의 // 구문 분석 데이터"가 동기식 또는 비동기식임을 확인하십시오. 비동기는 별도의 스레드가 그 시점부터 시작되고 현재 함수 실행이 지연없이 계속됨을 의미합니다.

두 번째 예에서는 별도의 스레드를 명시 적으로 작성하고 있습니다. 즉, @selector(function)이 별도의 스레드에서 발생하고 다음 문장 [spinner stopAnimating]이 즉시 실행됨을 의미합니다. 스피너가 전혀 회전하지 않는 것처럼 보입니다.

또한 주 스레드에서만 활동 표시기를 시작하고 중지하십시오.

관련 문제