我想注册一个设备匹配回调,以获取有关 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 的概念对我来说是新的,但是我在网上找到的所有示例代码看起来都像这样。我该怎么做才能异步执行设备检查而不阻塞我的主线程?