Dispatchgroupを理解している、または使用している問題があります。私はそれらについて多くを読んだことがありますが、ほとんどの例/ドキュメントは非常にあいまいであり、私がやりたいことに似ていませんが、私の問題を言及するたびに誰もが "DISPATCH GROUPSを使う"と言います。DispatchGroup.waitが待機していません
は、ここで私が何をしたいのです(注:順番は重要です):
- は、Bluetoothの書き込み特性を送信します。
- デバイスが値を受け取り、応答
- 読むブルートゥース応答(読み取り特性を経由して)
- で何かを吐くことは
- デバイスは、NEWコマンドを受信NEWを吐く新しい書き込み特性(異なるコマンド)を送信しますデータ応答
2回繰り返す(合計3コマンド、合計3応答)。
マイコード:これは次のコードとの確認があるbluetoothの書き込みコマンドを呼び出します
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
}
}
:
* * * * * 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
:今
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor descriptor: CBDescriptor, error: Error?) {
guard error == nil else {
print("Error writing descriptor: " + (error?.localizedDescription)!)
return
}
print("Descriptor Value sent")
}
は、ここに私の出力です
今、あなたのように"Characteristic Value Sent"は、Bluetoothの機能が値を送信したときの確認ですが、この出力はコード全体の実行が完了した後に作成されるため、基本的にはコマンドをパイプラインに入れ、それからコマンドを送ったので、私が読んでいる応答はすべてナンセンスです!受信した文字列はすべてT-Pod-9Ch(これは通常のバースト出力です)であり、コマンドから取得する必要がある応答はOK、OK、6桁の数字です(その順番)。
ディスパッチグループの仕事の仕方について何度も読んだことがありますが、私が望むことをすることができません。
が必要な場合は、入力している知ってみましょう残し、かつグループ全体を1つのスレッドで待機します。それは全く無意味です。 'wait()'を呼び出すたびに、あなたはすでにグループから退いたので、グループのカウンタは '0'になります。 –
あなたはそれについて詳述できますか?私は実際にそれがどのようにフォーマットされているのか理解できません。個々のタスクが入力/退出コマンド内になければならないと理解していました。そして、個々のコマンドを完了するのを待つ必要があります。 –
ディスパッチキューは、スレッド。 1)現在のスレッドで 'enter()'を呼び出す、2)いくつかの非同期タスクを開始する、または別のスレッドまたはディスパッチキューでコードを実行する、3)非同期タスクコールにleave() 'done()'コールが 'leave()'によってバランスが取られているときに 'notify()'を使ってコードを実行させる必要があります。コール。 –