続・AsyncBluetoothのNotifyがおかしい

先日修正したつもりだったが、まだおかしかった。

ちなみに先日の件はoobaさんによって修正PRが投げられ、すでにmergeさている🙏

今回発見した問題は、高速にNotifyによってデータを受け取っていると、AsyncBluetoothのせいで一部データをロストするというやばいやつ。


問題の詳細

具体的には、Peripheral.swift の

func peripheral(_ cbPeripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    ....
}

この peripheral(_:didUpdateValueFor:error) メソッドが呼ばれた直後ではcharacteristic.valueに所望のデータが入っているのだが、

self.context.characteristicValueUpdatedSubject.send(
    Characteristic(characteristic)
)

で送信され、

subscription = peripheral.characteristicValueUpdatedPublisher.sink(receiveValue: { [weak self] characteristic in
    ...
})

で受け取ったcharacteristicの中身を見ると、あとから didUpdateValueFor で届いたデータによって上書きされているということが多発した。

ここから先は

1,768字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/