0

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

4

0 回答 0