Bạn có thể sử dụng run loop sources. Về bản chất:
1) Trên sợi nhân thứ cấp tạo ra và cài đặt nguồn vòng lặp chạy, và vượt qua nó bằng cách nào đó, cùng với nhân viên chủ đề tham khảo chạy vòng lặp, vào chủ đề quản lý khác sẽ được gửi tin nhắn với trang này:
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
Ở đây có những thói quen tùy chỉnh nêu trên - bạn có trách nhiệm cung cấp cho họ:
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) Mở thread công nhân, bắt đầu vòng chạy bình thường, một cái gì đó tương tự như sau:
BOOL done = NO;
do {
int result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);
done = (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished);
} while (!done);
3) Bây giờ, về quản lý chủ đề mà bạn có thể báo hiệu (gửi tin nhắn) để nhận trước đó nguồn chạy vòng lặp khi cần thiết (và thức dậy vòng lặp chạy trong những chủ đề trong trường hợp nó đang ngủ):
CFRunLoopSourceSignal(runLoopSource);
CFRunLoopWakeUp(workerThreadRunLoop);
Các chi tiết khác có trong số guide của Apple.
Chính xác những gì tôi đang tìm kiếm. Ví dụ đơn giản, sạch sẽ tuyệt vời. –
ví dụ tuyệt vời – ashokdy