내가 추가 CFMachPortRef이가 GCD를 사용하여 수행 할 수 있습니다 내가 나 자신을 요구 한 스레드 CFRunLoop 이제GCD와 RunLoops 내 응용 프로그램에서
에 (CFMachPortCreateRunLoopSource를 통해)? 의 말을 대신 내 자신의 NSThread 산란과 파견의 runloop에 이벤트 포트를, CFRunLoopAddSource를 통해 자사의 실행 루프를 생성 CFRunLoopSourceRef을 추가하자?
나는 이것이 GCD의 내부 동작으로 인해 거의 작동하지 않을 것이라고 생각하지만 실제로는 모른다.
업데이트
I은 이벤트 탭이 지금까지, 그러나 콜백 기능도있어 나 dispatch_source_event_handler 블록이라고합니다. 어떤 아이디어?
CFMachPortRef port = CGEventTapCreate(kCGSessionEventTap,
kCGHeadInsertEventTap,
opts,
desc_.eventMask,
_CGEventCallback,
self);
// create dispatch source
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV,
CFMachPortGetPort(port),
0,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
// set event handler
dispatch_source_set_event_handler(source, ^{
printf("handle me!\n");
});
dispatch_resume(source);
'CFMachPort'는 마하 포트와 콜백을 결합합니다. GCD를 사용하여 Mach 포트를 모니터링하는 경우 콜백을 무시합니다. 이벤트 탭의 경우 콜백은 Core Graphics의 내부에 있으며 포트에서 Mach 메시지를 수신하고 디코딩 한 다음 * 콜백을 호출하는 등의 중요한 작업을 수행합니다. –