2013-02-14 1 views
0

IPhone 응용 프로그램을 작성 중입니다.알림 후 주 스레드에서 선택기를 수행하는 동안 오버레이를로드하는 것을 보여줍니다.

서버에서 비동기 업데이트를하고 있습니다.

- (void) updateReceived:(NSNotification *)notification 
{ 
    [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO]; 
} 

updateData : 업데이트 다운로드가 완료되면, 나는 통지를 받았을 때 수행됩니다 관찰자

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateReceived:) name:NOTIFICATION_DATA_RECEIVED object:nil]; 

그리고 선택을 선언 제의 ViewController에서 NSNotification

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_DATA_RECEIVED object:self userInfo:@{ @"updateKey": updateKey }]; 

를 발행 핵심 데이터에서 엔티티를 변경하고 다른 위협에서 수행 할 수 없기 때문에 주 스레드에서 수행해야합니다. 몇 가지 특정 라이브러리. 나는 그것을 바꾸고 싶지 않다.

내 문제 :

updateData 잠시 복용하고 주 스레드에서 이후는 UI를 동결된다. 이 작업이 완료되면 "데이터로드 중 ..."오버레이를 표시해야합니다.

나는 오버레이를 표시합니다 뷰 컨트롤러의 2 가지 방법이 있습니다 showLoadingOverlayhideLoadingOverlay

내가 그것을 할 때 updateData를 호출 showLoadingOverlayhideLoadingOverlay를 호출해야합니다.

문제는 데이터를 업데이트하는 동안 오버레이를 만드는 방법을 알지 못하는 주 스레드에서 발생하기 때문입니다. 알림을 보내기 전에 바로 표시하고 updateData 메쏘드 끝 부분에 숨기려고했지만 작동하지 않습니다.

도움을 주시면 대단히 감사하겠습니다.

감사

+0

메인 스레드에서 많은 처리를 수행 중이므로 앱을 차단하고 오버레이가 표시되지 않으므로이 경우 무거운 프로세스 즉 백그라운드 스레드에서 데이터를 업데이트하고 오버레이 메서드를 주 스레드에서. 도움이 – Singh

+0

안녕하세요, 답변 주셔서 감사합니다,하지만 주 스레드에서 데이터 업데이트를 할 필요가있다. 나는 그것을 바꿀 수 없다. – Youssef

+0

그런 다음 백그라운드 스레드에서 [self performSelectorInBackground : @selector() withObject : nil];으로 오버레이 추가를 수행 할 수 있습니다. . 이게 도움이되기를 바랍니다. – Singh

답변

0

나는 그것을 할 수있는 방법을 찾았습니다. NSTimer를 사용하여 1 밀리 초 오버레이를 표시 한 후 updateReceived 메소드를 실행했습니다.

0

어쩌면, 다만 어쩌면, 당신은 또한 주 스레드에서 예정되어 있지만, 때문에 updateData이 실행 된 후에 애니메이션을 사용하고 있습니다. 이 경우 updateData가 호출되기 전에 애니메이션이 시작되는지 확인하십시오. 예를 들어, 다음과 같이 할 수 있습니다.

- (void)updateReceived:(NSNotification*)notification { 
    [self startAnimationOnComplete: ^{ 
     [self performSelectorOnMainThread:@selector(updateData:) withObject:nil waitUntilDone:NO]; 
    }] 
}