在我的应用程序中,我将CFMachPortRef(通过CFMachPortCreateRunLoopSource)添加到线程CFRunLoop
现在我在问自己,这可以使用 GCD 完成吗?假设不是生成我自己的NSThread并通过CFRunLoopAddSource将创建的CFRunLoopSourceRef添加到其运行循环中,而是将事件端口添加到调度的运行循环中?
我认为由于 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);