2011-12-31 2 views
1

나는 이것을 며칠 동안 연구했지만 아무 것도 발견하지 못했습니다.IPhone UIActivityIndicator는 프로세스가 완료 될 때까지 표시되지 않습니다.

원하는 프로세스는 다음과 같습니다. 사용자가 팝업 창에서 입력 버튼을 누릅니다. -> ActivityIdicator가 나타나고 -> 저장 프로세스가 발생 함 -> ActivityIndicator가 사라집니다.

그러나 ActivityIndicator는 프로세스가 완료 될 때까지 표시되지 않으므로 아무 쓸모가 없습니다. 여기

UIActivityIndicator not working properly? 팝업 창 여기

-(void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    // the user clicked one of the Enter/Cancel buttons 
    [self performSelector:@selector(DisplaySpinner) withObject:nil afterDelay:0]; 
    if (buttonIndex == 1) 
    { 
     [self performSelector:@selector(EnterButtonClicked) withObject:nil afterDelay:0]; 
    } 
    else 
    { 
     NSLog(@"Name Cancel Clicked"); 
    } 
    [NameField resignFirstResponder]; 
    } 

에 대한 코드입니다 DisplaySpinner 방법에 대한 코드입니다 :

-(void)DisplaySpinner{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    [self.view addSubview:loadingIndicator]; 
    [loadingIndicator startAnimating]; 

    [pool release]; 
} 

나는 과정이 여기에 설명에 따라 시도

EnterButtonClicked 메서드에 저장 프로세스가 포함되어 있습니다. 별도의 프로세스로 실행 중이지만 ActivityIndicator는 프로세스가 완료 될 때까지 표시되지 않습니다.

제안 사항?

+0

프로세스가 완료된 후에는 어떻게됩니까? –

+0

다른 방법에서는 "NSLog"가 있습니까 ??? –

+0

@ DineshRaja.MaG 프로세스가 완료된 후에 가져옵니다. 그리고 예, 그렇습니다. 그러나 문제와 관련이 없습니다 (제 생각에는). – USS1994

답변

3

메인 실행 루프가 제어권을 회복 할 때까지 앱이 UIActivityIndicatorView을 표시하는 화면을 업데이트하지 않습니다. 처리 스레드가 주 스레드를 차단하면 완료 될 때까지 no UI 업데이트가 수행됩니다. 비동기 적으로 처리해야합니다.

회전 이벤트가 발생하면 willRotate...willAnimateRotation... 메쏘드가 주 실행 루프를 한 번에 호출됩니다. 따라서 활동 표시기를 표시하기 전에 메소드를 차단하십시오.

이 작업을 수행하려면 메서드 작업을 다른 스레드로 푸시해야합니다. 이 메소드는 작업이 완료되면 뷰 컨트롤러를 다시 호출하여 뷰를 업데이트 할 수 있습니다. 나는 willAnimateRotation... 방법에 활동 지시계를 보여줄 것이다.

실행 루프가 종료되지 않아도 UIActivityIndicatorView이 표시되기 시작해야합니다. 한 가지 방법은 -

[self performSelector:@selector(animation) withObject:nil afterDelay:0] 

-(void)startSpinner 
{ 
    NSAutoreleasepool *pool = [[NSAutorepleasepool alloc]init]; 
    [indicatorView startAnimating]; 
    [pool release]; 
} 

그래서 본질적으로, performSelector는 현재 스레드의 실행 루프에 animation 메시지를 수행 할 수있는 타이머를 설정합니다. 타이머는 기본 모드 ( NSDefaultRunLoopMode)로 실행되도록 구성됩니다. 타이머가 실행되면 스레드가 실행 루프에서 메시지를 대기열에서 빼내고 선택기를 수행하려고 시도합니다. 실행 루프가 실행 중이고 기본 모드 인 경우 성공합니다. 그렇지 않으면 타이머는 실행 루프가 기본 모드가 될 때까지 기다립니다.

지연을 0으로 지정한다고해서 반드시 선택자가 즉시 수행되는 것은 아닙니다. 선택기는 여전히 스레드의 실행 루프에 대기하고 가능한 한 빨리 수행됩니다.

+0

죄송합니다. 다소 혼란 스럽습니다. 대신 비동기 프로세스를 사용하는 것에 대해 귀하가 말하는 것을 이해하는 동안, 나는 당신이 무엇을하려고하는지 정확히 모르겠습니다. ActivityIndicatorView의 메서드를 재정의하고 있습니까? – USS1994

+0

실제로 내가 작성한 것은 해킹입니다.조금 더 연구를 해보면'performSelector'를 사용하여 animationSpinner를 시작하는 것이 더 좋습니다. 그러면 runloop에서 즉시 애니메이션이 호출됩니다. 내 업데이트 된 답변을 확인하십시오. 그것이 도움이되는지 말해주십시오 ... –

+0

이것은 나에게 의미가 있지만, 제가 시도한 것과 같은 것이 아닙니까? 어떤 이유로 그것은 작동하지 않습니다. 아니면 그냥 잘못 구현하고 있습니까? – USS1994

관련 문제