당신은 run loop sources를 사용할 수 있습니다. 본질적으로 :
1) 보조 작업자 스레드에 생성하고 실행 루프 소스를 설치하고, 이것에 메시지를 보내는 것, 다른 관리 스레드, 작업자 스레드 실행 루프 참조와 함께, 어떻게 든 통과 :
CFRunLoopSourceContext context = {0, self, NULL, NULL, NULL, NULL, NULL,
&RunLoopSourceScheduleRoutine,
RunLoopSourceCancelRoutine,
RunLoopSourcePerformRoutine};
CFRunLoopSourceRef runLoopSource = CFRunLoopSourceCreate(NULL, 0, &context);
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);
// Pass runLoopSource and runLoop to managing thread
다음은 위에서 언급 한 사용자 정의 루틴이있다 - 당신이 그들을 제공 할 책임이있다 : 작업자 스레드에
RunLoopSourceScheduleRoutine - called when you install run loop source (more precisely, when you call CFRunLoopAddSource)
RunLoopSourceCancelRoutine - called when you remove run loop source (more precisely, when you call CFRunLoopSourceInvalidate)
RunLoopSourcePerformRoutine - called when run loop source was signaled (received a message from manager thread) and this is a place where you should perform a job
2)이 평소 실행 루프, 비슷한 일을 시작 :
BOOL done = NO;
do {
int result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);
done = (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished);
} while (!done);
3) 이제) 필요할 때이 신호를 수 스레드 관리에 (이전에 수신 실행 루프 소스에) 메시지를 전송 (그리고 경우에 그 스레드의 실행 루프를 깨워은 잠 :
CFRunLoopSourceSignal(runLoopSource);
CFRunLoopWakeUp(workerThreadRunLoop);
자세한 내용은 Apple guide에 있습니다.
에서 "준비를위한 테스트"예를 코드를 연결합니다. 위대한 간단하고 깨끗한 예. –
우수한 예 – ashokdy