RxBluetoothKit 5.0.0 (was 4.0.2) 変更点

# はじめに

初投稿です。

[RxBluetoothKit](https://github.com/Polidea/RxBluetoothKit) のバージョンが5.0.0にアップデートされました。
その際，RxBluetoothKitに大きな変更がありましたので，動かせる程度の変更点をメモしておこうと思います。

# **RxBluetoothKit とは**
RxSwiftのようなRx記法にて，Bluetooth (CoreBluetooth)の機能を扱うことが可能なライブラリです。
現在（2018/03/17, version 5.0.0）では，[Central側のみサポート](https://github.com/Polidea/RxBluetoothKit/issues/166)されています。

# **変更点 (4.0.2 -> 5.0.0)**

## Managerクラス名の変更

**BluetoothManager -> CentralManager**

```swift
// Before ver_4.0.2
private let state: BluetoothManager

// After ver_5.0.0
private let state: CentralManager
```

RxBluetoothKitで扱うCBCentralManagerに当たるクラスです。
クラス名が変更されました。対応としては，そのまま置換で問題ありません。

## state名の変更

**rx_state.asObservable() -> observeState().startWith(manager.state)**

```swift
// Before ver_4.0.2
self.manager.rx_state.asObservable()
    .subscribe(onNext: { [weak self] state in
    /* 以下略 */

// After ver_5.0.0
self.manager.observeState().startWith(self.manager.state)
    .subscribe(onNext: { [weak self] state in
    /* 以下略 */
```

Bluetoothの接続状態をObservableで渡すことができる，Observable\<BluetoothState\>の名前が変更されました。
observeState()で取得し，新たに開始のメソッドを呼ぶ必要が出てきました。

## 接続メソッド名の変更

**connect(_ peripheral: Peripheral) -> establishConnection(_ peripheral: Peripheral)**

```swift
// Before ver_4.0.2
self.manager.connect(scannedPeripheral.peripheral)

// After ver_5.0.0
self.manager.establishConnection(scannedPeripheral.peripheral)
```

接続の際のメソッド名が変更されました。
返り値は`Observable<Peripheral>`で，変更はありません。

## サービス発見メソッドの返り値の変更

**discoverServices(_ serviceUUIDs: [CBUUID]?): Observable\<[Service]\> -> PrimitiveSequence\<SingleTrait, [Service]\>**

```swift
// Before ver_4.0.2
peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?) // return Observable<[Service]>

// After ver_5.0.0
peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?) // return PrimitiveSequence<SingleTrait, [Service]>
peripheral.discoverServices(_ serviceUUIDs: [CBUUID]?).asObservable() // return Observable<[Service]>
```

接続後のPeripheralクラスからサービスを読み込む，`.discoverServices()`の返り値が変更されました。
これまでの`Observable<[Service]>`へは，`.asObservable()`の追加にて対応可能です。

## 書き込みメソッドの返り値の変更

**writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
                           type: CBCharacteristicWriteType): Observable\<Charateristic\> -> PrimitiveSequence\<SingleTrait, Characteristic\>**

```swift
// Before ver_4.0.2
peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
                           type: CBCharacteristicWriteType) -> Observable<Characteristic>

// After ver_5.0.0
peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
                           type: CBCharacteristicWriteType) -> Single<Characteristic>
peripheral.writeValue(_ data: Data, for identifier: CharacteristicIdentifier,
                           type: CBCharacteristicWriteType).asObservable() -> Observable<Characteristic>
```

接続後のPeripheralクラスからデータを書き込む，`.writeValue()`の返り値が変更されました。
これまでの`Observable<Characteristic>`へは，`.asObservable()`の追加にて対応可能です。

## 読み込みメソッドの返り値の変更

**Observable\<Charateristic\> -> PrimitiveSequence\<SingleTrait, Characteristic\>**

```swift
// Before ver_4.0.2
characteristic.readValue() -> Observable<Characteristic>

// After ver_5.0.0
characteristic.readValue() -> Single<Characteristic>
characteristic.readValue().asObservable() -> Observable<Characteristic>
```

接続後のCharacteristicクラスからデータを読み込む，`.readValue()`の返り値が変更されました。
これまでの`Observable<Characteristic>`へは，`.asObservable()`の追加にて対応可能です。

## 値の変更を通知するメソッドの返り値の変更

**setNotificationAndMonitorUpdates() -> observeValueUpdateAndSetNotification()**

```swift
// Before ver_4.0.2
characteristic.setNotificationAndMonitorUpdates()
peripheral.setNotificationAndMonitorUpdates(for: characteristic)

// After ver_5.0.0
characteristic.observeValueUpdateAndSetNotification()
peripheral.observeValueUpdateAndSetNotification(for: characteristic)
```

Characteristicの値の変更を通知するメソッド名が変更されました。
返り値は`Observable<Characteristic>`で，変更はありません。

## 切断を通知するメソッド名の変更

**monitorDisconnection(for: Peripheral) -> observeDisconnect(for: Peripheral)**

```swift
// Before ver_4.0.2
self.manager.monitorDisconnection(for: Peripheral)

// After ver_5.0.0
self.manager.observeDisconnect(for: Peripheral)
```

Peripheralの切断を通知するメソッド名が変更されました。
返り値も変更されます。対応は下に分けました。

## 切断を通知するメソッドの返り値の変更

**Observable\<Peripheral\> -> Observable\<(Peripheral, DisconnectionReason?)\>**

```swift
// Before ver_4.0.2
self.manager.monitorDisconnection(for: Peripheral) // return Observable<Peripheral>

// After ver_5.0.0
self.manager.observeDisconnect(for: Peripheral) // Observable<(Peripheral, DisconnectionReason?)>
self.manager.observeDisconnect(for: Peripheral).map { $0.0 } // return Observable<Peripheral>
```

Peripheralの切断を通知するメソッドの返り値が変更されました。
返り値にError型のtypealias，`DisconnectionReason?`が追加されました。これまで通り不要であればmapしましょう。

## 切断メソッドの削除

**cancelPeripheralConnection(_ peripheral: RxPeripheralType) -> (deleted)**

```swift
// Before ver_4.0.2
self.manager.cancelPeripheralConnection(_ peripheral: Peripheral)

// After ver_5.0.0
// Removed
```

Peripheralを切断するメソッドが削除されました。
`centralManager.cancelPeripheralConnection()`の[commit履歴を追っていく](https://github.com/Polidea/RxBluetoothKit/commit/505c8774c2621bb17851ab85a0e7f02f72a8d8bf)と，Dispose時に実行されるようでした。
対応としては，`CompositeDisposable`などで保持したものを，切断時に`remove()`する等で解決できます。

# まとめ

個人的には，切断に関するメソッドが削除されたことで，大きく変更しなければならない部分が大きいのかな，と思います。
Peripheral側も(Rxではありませんが)サポートされている[BlueCap](https://github.com/troystribling/BlueCap)も，メソッドを呼んで切断することはできなかったと思います（間違っていたらすみません）。


いずれにしても，RxBluetoothKitでPeripheral側がサポートされるのが楽しみですね。