2017-09-26 3 views
1

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) 
} 

Répondre

3

Avez-vous vérifié DispatchGroup ??

func myFunction() { 
    var a: Int? 

    let group = DispatchGroup() 
    group.enter() 

    DispatchQueue.main.async { 
     a = 1 
     group.leave() 
    } 

    // does not wait. But the code in notify() is run 
    // after enter() and leave() calls are balanced 

    group.notify(queue: .main) { 
     print(a) 
    } 
} 
+1

Battez-moi. C'est ce que je ferais. –

+0

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 –

+0

vérifier ce https://stackoverflow.com/questions/37805885/ how-to-create-dispatch-queue-in-swift-3 – casillas