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)
}
打我吧。这是我会做的。 –
嗨,我读了一些关于调度组的消息,但它似乎并行运行它们,我不想并行运行,我希望它们运行SEQUENTIAL。主要原因是因为你可以从我的代码中读取我从receviedString1中读取的内容。这有BLE外围设备的响应,如果我在读取其响应之前发送了另一个命令,我可能正在读取其他内容的响应,这是我想要避免的 –
检查此https://stackoverflow.com/questions/37805885/如何创建调度队列在迅速3 – casillas