4

私はよく知られている (私が) シリアル周辺機器の上に構築した 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 をバックグラウンド スレッドで呼び出す方法はありますか?

ありがとうございました !

4

0 に答える 0