2012-11-06 3 views
0

이 코드를 가지고 후 계속. 하지만 깜짝! 활동 표시기는 여전히 작동하고 몇 초 후에 내보기가 엉망입니다.동작 표시 블록

어떻게해야합니까?

+0

가'[self.activityIndicator stopAnimating]은,'I'MPOSSIBLE @ – Venkat

+0

: 그것은 양보하지 않을 것이다 올바른 출력. 그것을 표시 한 직후 표시기를 멈추게합니다. –

+0

별도의 스레드에서 검사를 실행하고 있습니까? 그렇다면 활동 지시계를 멈출 때 제어가 주 실행 루프로 돌아 갔는지 확인하십시오. 이것은 지연을 설명 할 수 있습니다. – sooper

답변

2

당신은 당신의 완료 블록에서 활동 표시를 중지해야합니다 블록 후이 코드를 추가

[self setQRCodeScannerMode:false]; 
[self.activityIndicator startAnimating]; 
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) { 
    if ([[TBXML elementName:tbxmlDocument.rootXMLElement] isEqualToString:@"xxxxxx"]){ 
     [self setQRCodeScannerMode:true]; 
    } else { 
     [self setQRCodeScannerMode:true]; 
    } 

    [self.activityIndicator stopAnimating]; 
}; 

이것은 완료 블록이 주 스레드에서라고 가정합니다. 완료 블록이 할 수있는 주 스레드에서 호출된다는 보장이없는 경우 : 블록 사용 후

[self setQRCodeScannerMode:false]; 
[self.activityIndicator startAnimating]; 
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) { 
    if ([[TBXML elementName:tbxmlDocument.rootXMLElement] isEqualToString:@"xxxxxx"]){ 
     [self setQRCodeScannerMode:true]; 
    } else { 
     [self setQRCodeScannerMode:true]; 
    } 

    if ([NSThread isMainThread]) { 
     [self.activityIndicator stopAnimating]; 
    } else { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.activityIndicator stopAnimating]; 
     }); 
    } 
}; 
+0

좋습니다. 그러나 호기심에서 벗어나 다른 일을하는 것이 마지막입니다. 나는 그것을 얻지 못했다 –

+1

stopAnimating에 대한 호출 (모든 UI 메소드와 마찬가지로)은 주 스레드에서 수행되어야한다. 이 검사가 주 스레드인지 확인한 다음 움직이는 것을 중지합니다. 그렇지 않으면 주 스레드가 아닌 경우 호출을 호출하여 주 스레드에 애니 메이팅을 중지합니다. – rmaddy

+0

지금 알았습니다. 감사합니다 –

0

당신이 할 수있는 한 가지는 다른 스레드, 즉 주 스레드가 아닌 표시기로 작업하는 것입니다. NSOperationQueue 및 NSInvocationOperation을 사용할 수 있습니다.

+0

다른 스레드에서 활동 표시기를 중지 할 수 없습니다. 컨트롤이 주 스레드로 반환 될 때까지 UI에 대한 변경 사항은 발생하지 않습니다. – sooper

+0

@sooper 그렇습니다.하지만 작업이 완료되면 메인 스레드와 통신하도록 만들어야합니다. –

+0

메인 스레드에서 하나의 메소드를 호출하는 것만으로도 작업 설정이 과도하게 어려울 수 있습니다. – rmaddy

1

[self.activityIndicator stopAnimating]을 호출해야합니다. 당신이 그것을 끝내고 나면, 당신을 위해 일하지 않으면, 이것을 시도하십시오!

[self.activityIndicator performSelector:@selector(stopAnimating) withObject:nil afterDelay:0.1]; 

희망 하시겠습니까!

0

단순히

[self.activityIndicator stopAnimating];