2017-09-26 42 views
1

我有一个函数,我试图在Swift(X-Code)中做出。我基本上通过蓝牙发送一些命令,并且我对主Asyncafter的工作方式有疑问。这里是我的设置代码:DispatchQueues会相互等待吗?

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

我想它基本上做到以下几点(按照这个顺序):
writeValue
等待0.4秒
读取响应/检查响应
writeValue(读完后阅读/检查RESPONSE)
读响应/检查响应

恐怕如果代码是因为它是现在它只会溢出,同时等待其他的人也就有了在writeValues m在异步运行的单独线程上运行。
另外,让我感到困惑的是,我在开始时声明了delayForResponse,并且说每次调用它时都会改变它?就像我在12:00:00:00时那样,它会使它现在变为+ .4秒(所以它应该在12:00:00:40之间调用,但是在12:00:00会发生什么: 41,当它运行的第二部分(即有另一个标注到delayForResponse)会突然说:“什么?这应该0.01秒前必须已经完成!?

编辑这里的代码基础上另取一些反馈,将在做什么,我认为它会?

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

回答

3

你检查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

打我吧。这是我会做的。 –

+0

嗨,我读了一些关于调度组的消息,但它似乎并行运行它们,我不想并行运行,我希望它们运行SEQUENTIAL。主要原因是因为你可以从我的代码中读取我从receviedString1中读取的内容。这有BLE外围设备的响应,如果我在读取其响应之前发送了另一个命令,我可能正在读取其他内容的响应,这是我想要避免的 –

+0

检查此https://stackoverflow.com/questions/37805885/如何创建调度队列在迅速3 – casillas