Ich versuche drei gleichzeitige Tasks auszuführen, die jeweils ~ 30 Sekunden dauern. Es werden jedoch nur zwei gleichzeitig ausgeführt, und die dritte Aufgabe wartet darauf, dass eine dieser Aufgaben abgeschlossen wird, bevor sie beginnt.In der asynchronen Dispatch-Warteschlange werden nur zwei Tasks gleichzeitig ausgeführt
Mein aktueller Code:
func sliderMoved(_ label : UILabel, openCharacteristicNum : Int, closeCharacteristicNum : Int, sender: UISlider, sliderTimer:Timer){
//run this on a background thread
DispatchQueue.global(qos: .utility).async {
var actuatorPosition = self.getActuatorPosition(label)
if (actuatorPosition < sender.value) {
// stop closing (if it was) and start opening
self.writeValue(closeCharacteristicNum, value: 1, withResponse: false)
self.writeValue(openCharacteristicNum, value: 0, withResponse: false)
while actuatorPosition < senderValue && sliderTimer.isValid{
actuatorPosition = self.getActuatorPosition(label)
}
// stop opening
self.writeValue(openCharacteristicNum, value: 1, withResponse: false)
}
}
}
ich auch eine gleichzeitige Warteschlange Erstellen und Ausführen von drei Aufgaben in dieser Warteschlange versucht haben, aber immer noch nur zwei laufen gleichzeitig. Ich habe auch versucht, drei separate gleichzeitige Warteschlangen zu erstellen und eine Aufgabe in jedem auszuführen, hatte aber immer noch das gleiche Problem.
Meine einzige Vermutung ist, dass ich ein hartes Thread-Limit erreiche, dass iOS die App zu verwenden erlaubt, da jede Aufgabe den Thread vollständig blockiert bis abgeschlossen.
Ich würde es kein Problem nennen. Sie müssen mehr über die Semantik nachdenken, die für Ihren speziellen Fall/die Logik benötigt wird, die Sie implementieren müssen. Basierend darauf sind einige Fragen, die Sie führen könnten: 1 - Muss ich warten, bis alle fertig sind? 2 - wie viel Priorität haben sie jeder von ihnen. Mit den Antworten auf diese Fragen könnten Sie wählen, andere Strategien als Versandgruppen zum Beispiel oder Abhängigkeiten zwischen den Operationen zu verwenden, oder die QOS erforderliche Ebene zu ändern, zum Beispiel –
Ich endete mit Timern, um die Position des Stellantriebs regelmäßig zu überwachen, anstatt so schnell wie zu überwachen möglich mit einer while-Schleife. –