2017-06-05 3 views
0

Mise à jour: Je viens de vérifier leurs projets d'exemple et c'est la même chose. Donc, il peut s'agir d'un bug ou d'un comportement attendu. J'utilise RxBluetoothKit et ne peux pas résoudre le problème suivant. Je vais avoir cette fonction d'emballage pour écrire une caractéristique (je suis en train d'écrire un grand nombre d'entre eux avec concat, cela fonctionne bien):flatMap writeValue pour la caractéristique ne pas retourner Observable

func writeCharacteristicData(for peripheral: Peripheral, characteristicIdentifier: CharacteristicIdentifier, value: Data?) -> Observable<Characteristic> { 
guard let value = value else { 
    return Observable.error(BTError.noDataProvided(description: "Missing value for: \(characteristicIdentifier)")) 
} 
return peripheral 
    .connect() 
    .flatMap { $0.writeValue(value, 
    for: characteristicIdentifier, 
    type: .withResponse) } 
} 

Selon la documentation de RxBluetoothKit .flatMap { $0.writeValue } est l'une des façons d'écrire plus facile une caractéristique. En fait cela fonctionne très bien avec readValue et même avec ce writeValue, l'écriture est réussie, et si je le relis avec readValue après cela, le characteristic.value est OK dans oNext:.

Mon problème est que cette fonction renvoie un Observable<Characteristic> et mon hypothèse était que cela me rendra la valeur écrite. Mais ce n'est pas le cas, ou du moins ça ne marche pas pour moi. Il me donne des valeurs précédentes ou nul, je ne pouvais pas comprendre jusqu'ici quelle est la logique sur le Observable<Characteristic> émis. Ce serait vraiment bien si je pouvais récupérer la valeur écrite. Qu'est-ce que je fais mal?

J'ai même essayé les moyens plus, et celui-ci, mentionnée sur github:

characteristic.writeValue(data, type: .withResponse) 
.subscribe { event in 
    //respond to errors/successful read 
} 

La caractéristique (dans le rappel onNext:) émis n'est pas celui que j'ai écrit à l'appareil. C'est un précédent ou nul. Ce qui est marrant, c'est que si j'essaie de le relire et que j'écris après cela, la valeur character.value sera celle que j'ai lue avec $0.readValue. Mais si je recompile, j'en écris un complètement nouveau, c'est toujours le même que j'ai lu auparavant. C'est comme RxBluetoothKit en cache une valeur ou je n'ai aucune idée de quoi que ce soit.

Est-ce que cela peut poser un problème avec le périphérique ble? Peut-être que c'est un problème de thread ou quelque chose comme ça?

J'apprécierais vraiment n'importe quel genre de conseil ou d'astuces.

Merci,

Daniel

Répondre

0

Désolé pour l'absence de réponse, je viens de remarquer cela. Votre problème persiste-t-il? Si oui, veuillez écrire un problème sur notre Github. Il est lié au fonctionnement de Core Bluetooth et nous devrions peut-être améliorer notre documentation, il serait donc bon de l'avoir comme problème. Ce que vous devriez faire est de lire la valeur à nouveau - il indiquera alors la valeur correcte.