DeviceMatchingCallback никогда не выходит из цикла выполнения
Я хочу зарегистрировать обратный вызов сопоставления устройств, чтобы получать информацию о подключенных к хосту устройствах HID.
Я нашел несколько примеров кода, все они очень похожи, так что это мой фактический код, который близок к исходному коду библиотеки USBDeviceSwift:
// deviceManger and matchingDictionary are properly set up at this point
let deviceMatchingCallback: IOHIDDeviceCallback = {context, result, sender, device in
print("Connected")
}
let deviceRemovalCallback: IOHIDDeviceCallback = {context, result, sender, device in
print("Disconnected")
}
let runloop : CFRunLoop = CFRunLoopGetCurrent()
IOHIDManagerScheduleWithRunLoop(manager, runloop, CFRunLoopMode.commonModes.rawValue)
IOHIDManagerRegisterDeviceMatchingCallback(manager, deviceMatchingCallback, nil)
IOHIDManagerRegisterDeviceRemovalCallback(manager, deviceRemovalCallback, nil)
IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone))
print("start runloop") // this gets logged to the console
RunLoop.current.run()
print("runloop started") // this never appears
Моя проблема: приложение застревает в цикле выполнения. Первый оператор печати записывается в консоль. Когда я подключаю или отключаю соответствующие USB-устройства, соответствующие сообщения (подключенные или отключенные) регистрируются, поэтому, очевидно, обратные вызовы регистрируются правильно, но код после
RunLoop.current.run()
не выполняется.
Концепция runLoop для меня нова, но весь пример кода, который я нашел в сети, выглядит именно так. Что мне нужно сделать, чтобы проверка устройств выполнялась асинхронно, не блокируя мой основной поток?