Продлить тайм-аут соединения Bluetooth только после успешного подключения с помощью RxBluetoothKit - PullRequest
0 голосов
/ 22 января 2019

Что я хочу сделать:

  1. Записать значение в характеристику
  2. Если в течение определенного времени не удается установить соединение, обработать как ошибку времени ожидания
  3. Еслисоединение успешно, продлить или игнорировать тайм-аут и сохранить соединение

Я понял 1 и 2, но как я могу реализовать 3?Большое спасибо за вашу помощь.

Мой источник:

manager = CentralManager(queue: .main, options: options)
manager!.observeState()
    .startWith(self.manager!.state)
    .filter { $0 == .poweredOn }
    .timeout(3.0, scheduler: MainScheduler.instance)
    .take(1)
    .flatMap { _ in self.manager!.retrievePeripherals(withIdentifiers: [peripheralUUID])[0].establishConnection() }
    .timeout(5.0, scheduler: MainScheduler.instance) // (A) Set connection timeout here
    .flatMap{ $0.writeValue(data, for: BLECharacteristic.char, type: .withResponse)}
    .subscribe(onNext: { char in
        // (B) I want to extend timeout here
        // Handle success
    }, onError: { (error) in
        // Handle error
    }, onCompleted: nil, onDisposed: nil)

1 Ответ

0 голосов
/ 22 января 2019

Требуется, чтобы наблюдаемое для подключения к тайм-ауту, а не для наложения таймаута на всю цепочку

// ...
.take(1)
.flatMap { _ in 
  self.manager!.retrievePeripherals(withIdentifiers: [peripheralUUID])[0]
    .establishConnection()
    .timeout(5.0, scheduler: MainScheduler.instance)
    .take(1)
}
.flatMap{ $0.writeValue(data, for: BLECharacteristic.char, type: .withResponse) }
// ...

Добавление .take(1) гарантирует, что наблюдаемое завершается после установления соединения (хотяв идеальном мире, establishConnection() должен быть ответственным за это поведение).

...