J'ai un problème de compréhension ou d'utilisation de Dispatchgroup. J'ai beaucoup lu à leur sujet mais la plupart des exemples/documents sont très vagues ou ne ressemblent pas à ce que je veux faire, cependant à chaque fois que je mentionne mon problème, tout le monde dit "UTILISER DES GROUPES D'EXPÉDITION!"DispatchGroup.wait n'attend pas
Voici ce que je veux faire (NOTE: COMMANDER SEQUENTIAL EST CRUCIAL):
- Envoyer Bluetooth écriture caractéristique.
- dispositif reçoit la valeur et recrache quelque chose en réponse
- Lire la réponse Bluetooth (via une lecture caractéristique)
- Envoyer une nouvelle caractéristique d'écriture (une autre commande)
- dispositif reçoit la commande NOUVEAU, recrache NOUVEAU réponse des données
Répéter deux fois (3 commandes au total, 3 réponses différentes au total).
Mon code:
func tPodInitialSetUp()
{
print ("* * * * * BEGIN SET-UP * * * * *")
let setupDispatchGroup = DispatchGroup()
setupDispatchGroup.enter()
self.writeValue(command: Data(CommandModeCmd)) //231: Put t-Pod in command mode, burst mode is OFF returns OK
setupDispatchGroup.leave()
setupDispatchGroup.wait()
setupDispatchGroup.enter()
deviceConnected?.readValue(for: deviceConnectedCh1n2Char!)
print("Sent command 231: returned: \(receivedString1)")
if receivedString1.lowercased() == "ok"
{
print("t-Pod burst mode is OFF")
}
setupDispatchGroup.leave()
setupDispatchGroup.wait()
setupDispatchGroup.enter()
self.writeValue(command: Data(loadProbeCalCmd)) //202: load calibration constants of probe, returns ok or 0
setupDispatchGroup.leave()
setupDispatchGroup.wait()
setupDispatchGroup.enter()
deviceConnected?.readValue(for: deviceConnectedCh1n2Char!)
print("Sent command 202: returned: \(receivedString1)")
if receivedString1.lowercased() == "ok"
{
print("Probe Constants loaded")
}
if receivedString1 == "0"
{
print("No probe connected")
}
setupDispatchGroup.leave()
setupDispatchGroup.wait()
setupDispatchGroup.enter()
self.writeValue(command: Data(probeSNCmd)) //205: load probe serial number
setupDispatchGroup.leave()
setupDispatchGroup.wait()
setupDispatchGroup.enter()
deviceConnected?.readValue(for: deviceConnectedCh1n2Char!)
print("Sent command 205: returned: \(receivedString1)")
if (receivedString1.count == 6)
{
print("received Probe SN: \(receivedString1)")
probeSN = receivedString1
}
setupDispatchGroup.leave()
setupDispatchGroup.notify(queue: .main)
{
tPodSN = String(describing: connectedDeviceName!.dropFirst(7))
print ("* * * SET-UP COMPLETE * * *")
self.writeValue(command: Data(resetCmd)) //200: resets t-Pod
self.writeValue(command: Data(beaconOffCmd)) //211: turns beacon off (temperature output)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
{
self.dataDisplaySubView.isHidden = false
print ("Adding observers!")
NotificationCenter.default.addObserver(self, selector: #selector(self.updateIncomingData), name: NSNotification.Name(rawValue: DATA_PARSED), object: nil) //Run every time you receive data from BLE
NotificationCenter.default.addObserver(self, selector: #selector(self.calculateTNU), name: NSNotification.Name(rawValue: TOGGLESWITCH_TOGGLED), object: nil) //Run in case the toggle switches change and data needs to be re-calculated
NotificationCenter.default.addObserver(self, selector: #selector(self.parseReceivedData), name: NSNotification.Name(rawValue: DEVICE_FINISHED_SENT_DATA), object: nil) //Run every time you receive the notification that the whole data has been sent
}
}
Ceci appelle la commande d'écriture Bluetooth qui a le code suivant et confirmation:
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor descriptor: CBDescriptor, error: Error?) {
guard error == nil else {
print("Error writing descriptor: " + (error?.localizedDescription)!)
return
}
print("Descriptor Value sent")
}
Maintenant, Voici ma sortie:
* * * * * BEGIN SET-UP * * * * *
***** WRITING *****
Wrote: 1 bytes
***** WRITING *****
Wrote: 1 bytes
Sent command 231: returned: **T-Pod-9Ch**
***** WRITING *****
Wrote: 1 bytes
Sent command 202: returned: **T-Pod-9Ch**
***** WRITING *****
Wrote: 1 bytes
Sent command 205: returned: **T-Pod-9Ch**
* * * SET-UP COMPLETE * * *
***** WRITING *****
Wrote: 1 bytes
***** WRITING *****
Wrote: 1 bytes
Characteristic Value sent
Adding observers!
Characteristic Value sent
Characteristic Value sent
Characteristic Value sent
Characteristic Value sent
Clearing TNU Array
Maintenant, comme vous peut voir "Caractéristique Valeur Envoyée" est la confirmation que la fonction Bluetooth donne quand elle envoie la valeur, mais cette sortie est créée APRÈS avoir terminé l'exécution du code entier, donc fondamentalement, il a mis les commandes dans un pipeline, a oublié tout fait et Puis envoyé les commandes et donc la réponse que je suis en train de lire sont des absurdités! Comme vous pouvez voir toutes les chaînes reçues sont T-Pod-9Ch (qui est juste sa sortie en rafale normale), les réponses attendues que je devrais obtenir des commandes sont OK, OK et un nombre de 6 chiffres (dans cet ordre).
S'il vous plaît, aidez, j'ai lu tant de fois sur la façon dont les groupes de distribution sont censés fonctionner mais je ne peux pas les amener à faire ce que je veux.
vous entrez, en laissant, et attendre le groupe sur un seul fil. C'est complètement inutile. Chaque fois que vous appelez 'wait()', le compteur du groupe est '0' car vous avez déjà quitté le groupe. –
Pouvez-vous élaborer là-dessus? Je ne comprends pas vraiment comment il est censé être formaté, d'après ce que j'ai compris chaque tâche devait être dans les commandes d'entrée/sortie et j'ai besoin d'eux pour attendre chaque commande individuelle –
Les files d'attente sont pour synchroniser les choses entre threads. Généralement vous les utilisez comme ceci: 1) appelez 'enter()' sur le thread courant, 2) démarrez une tâche asynchrone et/ou exécutez du code sur une autre file d'attente ou de distribution, 3) appelez la tâche async 'leave() 'quand c'est fait, 4) répéter pour toutes les autres tâches qui doivent être faites, et 5) utiliser' notify() 'pour faire exécuter du code quand tous les appels' enter() 'ont été équilibrés par' leave() ' appels. –