Я попытался кэшированием периферического, обслуживания и характерные объектов в памяти и ручного кэширования не работает. Как только вы отключитесь от периферии, сервисные и характерные объекты больше не подходят для использования. Фактически даже CBPeripheral может переключаться из-под вас - CoreBluetooth имеет внутреннее поведение, когда UDID устройства будет меняться каждые несколько минут (если CBPeripheral - другое устройство iOS).
Однако, если вы работаете в разработке для iOS 6, есть способ ускорить работу. Если вы используете watch расширенный разговор Bluetooth на WWDC 2012, вы увидите слайд в конце о кешировании сервисов и характеристик. По сути, ОС может кэшировать их все для вас , но только для сопряженных устройств. Для сопряжения вам необходимо ответить на запрос записи с недостаточной ошибкой проверки подлинности. Например, для периферийного устройства IOS можно было бы написать что-то вроде:
- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
...
[peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];
...
}
Это будет всплывающее диалоговое окно спаривание на IOS периферийная, после чего вы будете работать в паре. Помимо этого вам не нужно менять свой код - просто вызовите функции DiscoverServices и т. Д., Как обычно, и они будут реагировать быстрее (т.е. мгновенно).
Я также протестировал это поведение на 10.8.3 и, похоже, не работает. Итак, я не знаю, как ускорить работу на OS X (кроме подключения к периферии).
Вы спрашиваете, как кешировать что-то в своем приложении? –
Это было бы решением для кеширования сервисов и характеристик, но я уже пытался сделать копию услуг. Но, к сожалению, CBPeripheral, CBService и CBCharacteristic не приняли NSCopying. Есть ли другой способ их хранения? –
Вы можете поместить Pripheral в массив. Этот массив вы можете «сохранить» как пользователь по умолчанию с NSUserDefaults Class –