0

내 앱에는 3 개의 화면이 있습니다. 첫 번째는 로그인입니다. 두 번째는 검색이고 세 번째는 작업을 처리하는 것입니다. 로그인 할 때 웹 서비스에서 데이터를 검색합니다. XML 형식의 데이터를 반환합니다. 따라서 데이터가 상당히 큽니다.iOS에서 두 개의 화면과 하나의 활동 표시기 다루기

-(BOOL)loginEmp 
{ 
.....some computation 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
               (unsigned long)NULL), ^(void) { 
      [self getAllCustomerValues]; 
     }); 
} 
-(void)getAllCustomerValues 
{ 
    ....more computation.Bring the data,parse it and save it to CoreData DB. 
    //notification - EDIT 

NSNotification *notification =[NSNotification notificationWithName:@"reloadRequest" 
                  object:self]; 
[[NSNotificationCenter defaultCenter] postNotification : notification]; 

} 
//EDIT 

//SearchScreenVC.m 
- (void)viewDidLoad 
{ 
....some computation 
    [self.customerActIndicator startAnimating]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(stopActivityIndicator) 
              name:@"reloadRequest" 
              object:nil]; 
    } 
- (void)stopActivityIndicator 
{ 
[self.customerActIndicator stopAnimating]; 
self.customerActIndicator.hidesWhenStopped = YES; 
self.customerActIndicator.hidden =YES; 
NSLog(@"HIt this at 127"); 
} 

그래서 로그인이 성공 것을 조건으로, 전 화면 2로 이동하지만 백그라운드 스레드가 진행 여전히 (: 그래서 내가 Mainthread 날에 얼어 중지하려면이 같은 배경 스레드에서 해당 작업을하고있는 중이 야 Logging 값을 가지고 있기 때문에 알 수 있습니다.) 사용자가 검색을 시작하기 전에 기다려야한다는 것을 알려주는 활동 표시기 (여기서는 2 번째 화면)가 필요합니다. 어떻게해야합니까? 내 활동 표시기를 수신 대기/백그라운드 스레드 기다릴 수있는 방법은 무엇입니까? 자세한 정보가 필요하면 알려주세요. 감사합니다.

EDIT : 이에 따라 편집되었으므로 알림이 전송되지 않습니다. SearchScreen의 viewDidLoad에서 getAllCustomerValues의 끝에 알림을 넣었습니다. 애니메이징을 중지하는 두 번째 화면의 알림이 절대로 호출되지 않습니다. 내가 뭘하고있는 실수입니까? 감사합니다

EDIT 2 : 그래서 마침내 방법을 안타. 나는 그것이 그 방법에 부딪치게 만드는 원인을 모른다. 나는 브레이크 포인트를 뒀다. 나는 애니메이션 작업을 중단하라고 썼다. 나는 가죽을 썼다. 예를 들어 둘 다 숨겨 뒀다. 하지만 여전히 애니메이션을 유지하고 있습니다. 어떻게 멈추게합니까?

+0

값을 기록하고 있으므로 구문 분석이 완료되었을 때를 알 수 있습니다. 일반적으로, 그 시점에서 NSNotification을 사용하여 UI가 검색을 허용 할 수 있음을 알립니다. – livingtech

+0

getAllCustomerValues ​​프로세스가 끝나면 프로세스가 완료되었음을 나타내는 기본 스레드에서 메소드를 호출하십시오. 알림을 전송하거나 플래그를 설정하십시오. 그 통보가 최선의 방법 일 것입니다. – Bergasms

+0

@livingtech. 알림 코드를 추가했습니다. 저기서 실수를 저에게 말해주세요. – RookieAppler

답변

1

기본 스레드가 아니라면 다음을 입력하십시오. 모자가 그것을 고쳐야합니다.

- (void)stopActivityIndicator 
{ 
     if(![NSThread isMainThread]){ 
     [self performSelectorOnMainThread:@selector(stopActivityIndicator) withObject:nil waitUntilDone:NO]; 
      return; 
     } 

[self.customerActIndicator stopAnimating]; 
    self.customerActIndicator.hidesWhenStopped = YES; 
    self.customerActIndicator.hidden =YES; 
    NSLog(@"HIt this at 127"); 
} 
0

백그라운드 작업을 별도의 클래스에 넣은 다음 위임을 설정하여 작업 완료 후 위임자에게 알릴 수 있습니까?

나는이 시도 havent 한 그 단지 아이디어 :

0

당신은 당신의 뷰 컨트롤러 &처럼 뷰 컨트롤러에서 메서드를 가리키는 대리자를 사용할 수 있습니다 다음

- (void) updateProgress:(NSNumber*)percentageComplete { 
}

과의 배경 스레드 :

float percentComplete = 0.5; // for example 
NSNumber *percentComplete = [NSNumber numberWithFloat:percentComplete]; 

[delegate performSelectorOnMainThread:@selector(updateProgress:) withObject:percentageComplete waitUntilDone:NO]; 
+0

제 FirstScreen에서 updateProgress 메소드를 선언했습니다.이 파일과 같은 h 파일 BackgroundThreadFinished - (void) updateProgress : (NSNumber *) percentComplete; 끝. 그래서 백그라운드 스레드의 끝에 나는 당신이했던 것처럼 호출하고 "아무 인스턴스 메서드 또는 선택기 'performSelectorOnMainThread ...'모르겠다는 오류를 보여줍니다. 어떻게? – RookieAppler

+0

당신은 당신의 대리인을 선언해야합니다 : @property (assign) NSObject * 대리자; 일반적인 'id'대신 NSObject *를 사용합니다. [here] (http://stackoverflow.com/questions/4499343/compiler-gives-warning-on)를 참조하십시오. - 선택 방법을 읽거나 쓰레기를 버리는 방법을 선택하십시오) – lidders