J'ai une fonction que j'essaie de faire dans Swift (X-Code). J'envoie essentiellement quelques commandes sur bluetooth et j'ai une question sur le fonctionnement du Main Asyncafter. Voici mon set-up code:Est-ce que les DispatchQueues attendent les uns les autres?
func tPodSetUp()
{
var delayForResponse = DispatchTime.now() + 0.4 //seconds to wait for response
writeValue(data: "231") //Put t-Pod in command mode, burst mode is OFF returns OK
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if receivedString1.lowercased() == "ok"
{
print("t-Pod burst mode is OFF")
}
}
writeValue(data: "202") //load calibration constants of probe, returns ok or 0
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if receivedString1.lowercased() == "ok"
{
print("calibration Loaded")
}
if receivedString1 == "0"
{
print("No probe connected")
}
}
}
Je veux essentiellement réaliser les opérations suivantes (dans cet ordre):
WriteValue
0,4 secondes d'attente
read réponse/Contrôle de la réponse
WriteValue (APRÈS IT FINI lECTURE/rÉPONSE checking) de réponse
de lecture/check réponse
Je crains que si le code est tel qu'il est en ce moment il sera simplement envahi les writeValues en attendant que les autres et auront la m sur des threads séparés fonctionnant de manière asynchrone.
Aussi, ce qui me déroute, c'est le fait que j'ai déclaré delayForResponse au début, et que je dirais que ça change à chaque fois que ça s'appelle? comme si je le fais à 12: 00: 00: 00 il le fera maintenant + .4 secondes (donc il est censé être appelé à 00: 00: 00: 40, mais alors ce qui se passera à 12:00:00: 41 lorsqu'il exécute la seconde partie (qui a une autre à delayForResponse callout) il va dire tout à coup « quoi? ce devait être fait il y a déjà .01 secondes !?
EDIT VOICI une autre prise sur le code basé sur des commentaires, va le faire ce que je pense que ça va?
let setupQueue = DispatchQueue(label: "setupQueue")
let delayForResponse = DispatchTime.now() + 0.4 //seconds to wait for response
setupQueue.sync {
writeValue(data: String(UnicodeScalar(UInt8(231)))) //231: Put t-Pod in command mode, burst mode is OFF returns OK
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if receivedString1.lowercased() == "ok"
{
print("t-Pod burst mode is OFF")
}
}
writeValue(data: String(UnicodeScalar(UInt8(202)))) //202: load calibration constants of probe, returns ok or 0
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if receivedString1.lowercased() == "ok"
{
print("t-Pod burst mode is OFF")
}
if receivedString1 == "0"
{
print("No probe connected")
}
}
writeValue(data: String(UnicodeScalar(UInt8(204)))) //204: load t-Pod serial number
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if (receivedString1.count > 5)
{
print("received t-Pod SN: \(receivedString1)")
tPodSN = receivedString1
}
}
writeValue(data: String(UnicodeScalar(UInt8(205)))) //205: load probe serial number
DispatchQueue.main.asyncAfter(deadline: delayForResponse)
{
if (receivedString1.count > 3)
{
print("received Probe SN: \(receivedString1)")
probeSN = receivedString1
}
}
//AFTER FINISHING SETUP, RESET TPOD AND TURN BEACON OFF
writeValue(data: String(UnicodeScalar(UInt8(202)))) //200: resets t-Pod
writeValue(data: String(UnicodeScalar(UInt8(202)))) //211: turns beacon off (temperature output)
}
Battez-moi. C'est ce que je ferais. –
Salut, je lis un peu sur les groupes de dispatch mais il semble qu'ils les exécutent en parallèle, je ne veux pas courir en parallèle, je veux qu'ils lancent SEQUENTIAL. La raison principale est que, comme vous pouvez le lire dans mon code, je lis à partir de receviedString1. Cela a la réponse du périphérique BLE, si je lui envoie une autre commande avant de lire sa réponse je pourrais lire la réponse à quelque chose d'autre qui est ce que je veux éviter –
vérifier ce https://stackoverflow.com/questions/37805885/ how-to-create-dispatch-queue-in-swift-3 – casillas