Je travaille actuellement avec CBPeripheralDelegate
pour échanger des messages entre un périphérique iOS et une clé USB Bluetooth Low Energy. Je dois implémenter la méthode sendMessage:
qui écrit des octets de données à l'aide d'un service d'émulation série. Cette méthode doit envoyer une trame de 15 octets (ou moins) à la fois, en attendant un accusé de réception du dongle avant d'envoyer le suivant.Bloquer une boucle for jusqu'à ce qu'une méthode déléguée soit renvoyée
Ci-dessous mon code:
- (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];
}
Maintenant la question: la boucle for
dans la méthode sendMessage:
doit être bloqué jusqu'à ce que le périphérique ne recevra pas le ack, peut-être avec un délai d'attente. Cet accusé de réception est reçu à l'intérieur de la méthode déléguée - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
, donc ici je dois redémarrer la boucle for
précédemment bloquée.
Quelle est la meilleure pratique pour cette situation particulière? Je voudrais utiliser les sémaphores de GCD, mais je n'arrive pas à comprendre comment implémenter des appels synchrones et n'arrive pas à comprendre l'un des nombreux exemples en ligne qui expliquent cette technique.
Est-ce que quelqu'un pourrait me donner un coup de main?
assez facile, je vous remercie. L'approche la plus simple et directe. Juste une petite remarque: nécessaire pour définir une propriété pour la taille du tableau 'chunks' d'origine, car elle diminue à chaque envoi de bloc. – Dree