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 для меня нова, но весь пример кода, который я нашел в сети, выглядит именно так. Что мне нужно сделать, чтобы проверка устройств выполнялась асинхронно, не блокируя мой основной поток?

0 ответов

Другие вопросы по тегам