В моем приложении я добавляю CFMachPortRef (через CFMachPortCreateRunLoopSource ) к потокам CFRunLoop
Теперь я спрашивал себя, можно ли этобыть сделано с помощью GCD?Скажем, вместо того, чтобы порождать мой собственный NSThread и добавить созданный CFRunLoopSourceRef в его цикл выполнения через CFRunLoopAddSource , добавить порт события в runloop диспетчеризации?
Я думаю, что это, скорее всего, не будет работать из-за внутренней работы GCD, но я действительно не знаю.
Обновление
Iдо сих пор не получил этого, однако не вызывается ни функция обратного вызова для события tap, ни блок 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);