2013-04-15 3 views
0

플래그로 제어되는 루프를 통해 활성 상태로 유지되는 작업자 스레드가 있습니다. 스레드가 원격 서버에 대한 영구 연결을 열 때 응용 프로그램의 길이만큼 살아 있어야합니다.긴 수명 스레드가 performSelectorOnMainThread를 호출하지 않습니다.

그 스레드를 해고하고 그것에 여러 가지 방법을 호출이 잘 작동하는 것 같다과 메서드를 호출 할

[worker performSelector:@selector(getBusy) onThread:worker withObject:nil waitUntilDone:NO];

. getBusy에서 어떤 시점에서 내가 함께 메인 스레드에서 메소드를 호출하려고 :

대표는 별도의 스레드를 시작하는 클래스에 대한 참조입니다

[delegate performSelectorOnMainThread:@selector(gotBusy) withObject:nil waitUntilDone:NO

.

문제는 gotBusy이 주 스레드에서 절대로 호출되지 않는다는 것입니다. 나는 NSLog() 문으로 그것을 뒤죽박죽으로 만들었고 콘솔에 출력 된 것을 볼 수 없었다.

디버깅하려면 무엇을해야합니까?

답변

2

먼저 delegate이 0이 아닌지 확인하십시오. 둘째, 기본 이벤트 루프가 차단되지 않고 모달 모드로 실행되지 않는지 확인하십시오.

+0

예, 주 짝수 루프가 잠자기 상태입니다. 귀하의 의견은 내 머리 속에 전구를 만들었습니다. – ruipacheco

+0

우수 - 주 스레드를 차단하거나 절대로 절대로 사용하지 마십시오. 또한 정교한 이벤트 (예 : 데이터를 폴링하기 위해 1/10th마다 꺼지는 타이머)를 많이 예약하지 않아야합니다. – bbum

+0

이것은 단위 테스트입니다. 플래그가 false로 설정되어있는 동안 잠을 자고 있었고 백그라운드 스레드가 주 스레드를 호출하지 못하도록 차단한다는 것을 인식하지 못했습니다. – ruipacheco

0

delegate을 할당 한 적이 없으므로 무 객체에 performSelectorOnMainThread을 호출 할 수 있습니까? waitUntilDoneYES으로 설정하면 작업자 스레드가 차단되어 대리인이 작업을 수행 할 수 있습니다.

+0

아니요, 위임자는 0이 아닙니다. 그 방법을 호출하기 전에 NSLog. 그러나 좋은 생각, 나는 그것을 기다리라고 말할 것이다. – ruipacheco