您可以使用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