私のアプリでは、 ( CFMachPortCreateRunLoopSourceを介して) CFMachPortRefをスレッドCFRunLoopに追加します
今、私は自問自答していましたが、これは GCD を使用して行うことができますか? 独自のNSThreadを生成し、作成されたCFRunLoopSourceRef を CFRunLoopAddSourceを介してその実行ループに追加する代わりに、イベント ポートをディスパッチの実行ループに追加するとしましょう。
GCDの内部の仕組みにより、これはおそらく機能しないと思いますが、本当にわかりません。
アップデート
これまでのところ、イベントタップのコールバック関数も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);