私はよく知られている (私が) シリアル周辺機器の上に構築した BLE 周辺機器を持っています。そのシリアル周辺機器用に、シリアルプロトコルを実装するホームメイドライブラリ全体があります。プロトコルは次のルールに従います。メッセージを送信すると、すぐに応答が返されます。
右。CoreBluetooth.framework を使用して、Bluetooth 経由の通信を再実装しましたが、それほど悪くはありません。私の主な問題は、応答を受け取ることを検討する前に、didUpdateValueForCharacteristic が呼び出されるまで待機することでした。(stackoverflowの人に感謝します。ここで私の命を救った多くの返信を見つけました)
しかし、今私のデバイスと話すとき、私は次のようなことをしなければなりません:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
dispatch_async(m_ProcessingQueue, ^{
bool ok = [MyPeripheral ExcecuteCommand];
});
}
私はそれを行う場合:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
bool ok = [MyPeripheral ExcecuteCommand];
}
didUpdateValueForCharacteristic は呼び出されません。実行コマンドがタイムアウトし、false を返します。THEN didUpdateValueForCharacteristic が呼び出され、適切なデータが含まれています。
didUpdateValueForCharacteristic がメインスレッドで呼び出されていることを発見しました:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
NSLog(@"didUpdateValueForCharacteristic %@", [NSThread isMainThread]?@"is main thread":@"is NOT main thread"); // wich reply true !
}
したがって、[MyPeripheral ExcecuteCommand] を呼び出さない場合。別のスレッドでは、メインスレッドがブロックされ、didUpdateValueForCharacteristic が呼び出されることはありません。
最後に私の質問は: didUpdateValueForCharacteristic をバックグラウンド スレッドで呼び出す方法はありますか?
ありがとうございました !