私は現在、iOSデバイスとBluetooth Low Energy USBドングルの間でメッセージを交換するためにCBPeripheralDelegate
と協力しています。私はシリアルエミュレーションサービスを使用してデータバイトを書き込むsendMessage:
メソッドを実装する必要があります。この方法では、その時点で15バイト(またはそれ以下)のフレームを送信し、次のフレームを送信する前にドングルからのACKを待つ必要があります。以下はデリゲートメソッドが起動するまでforループをブロックする
は私のコードです:
- (void)sendMessage:(NSData *)message {
NSArray *chuncks = [self splitMessage:message];
for (NSUInteger i = 0; i < chunks.count; i++) {
NSData *chunk = [chunks objectAtIndex:i];
[self sendChunk:chunk withId:i ofChunks:chances.count];
// Wait for the ack to be received
}
}
- (void)sendChunk:(NSData *)chunk withId:(NSInteger)id ofChunks:(NSInteger)count {
NSMutableData *frame = [NSMutableData new];
// Here I build my frame, adding header, current chunk ID and total number of chunks, then I call...
[serialEmulationService writeValue:frame forCharacteristic:serialEmulationServiceCharacteristic type:CBCharacteristicWriteWithResponse];
}
今問題:sendMessage:
メソッド内for
ループは、周辺はおそらくタイムアウトで、ACKを受信しなくなるまでブロックされることがあります。このACKはデリゲートメソッド- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
の中で受信されますので、ここで私はfor
ループを以前にブロックし直さなければなりません。
この特定の状況のベストプラクティスは何ですか?私はGCDのセマフォを使いたいと思いますが、同期呼び出しを実装する方法を理解することはできず、このテクニックを説明する多くのオンラインの例を理解することはできません。
誰かが私に手を貸してくれますか?
十分に簡単、ありがとうございました。最もシンプルで簡単なアプローチ。ちょっとした発言:元の 'chunks'配列サイズのプロパティを定義する必要がありました。なぜなら、それはすべてのチャンク送信時に減少するからです。 – Dree