В моем приложении я добавьте CFMachPortRef (через CFMachPortCreateRunLoopSource) до нитей CFRunLoopНОД и RunLoops
Сейчас я задавал себе, это может быть сделано с помощью НОД? Скажем, вместо нерест моего NSThread и добавьте созданный CFRunLoopSourceRef его запуск цикла через CFRunLoopAddSource, добавьте порт события для runloop депеши в?
Я думаю, что это скорее всего не сработает из-за внутренней работы GCD, но я действительно не знаю.
Update
Я получил это до сих пор, однако ни функцию обратного вызова для крана событий, ни блок 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» объединяет порт Mach с обратным вызовом. Если вы используете GCD только для контроля порта Mach, вы игнорируете обратный вызов. В случае касания события обратный вызов является внутренним для Core Graphics и, по-видимому, делает важные вещи (например, получение сообщения Mach из порта, его декодирование и вызов * вашего * обратного вызова). –