2017-01-17 1 views
0

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.

+0

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 –

+0

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. –

Antwort

0

hatte aber immer noch das gleiche Problem

Außer, dass es kein "Problem" hier.

Meine einzige Vermutung ist, dass ich ein harter Thread-Limit bin schlagen, die iOS die App verwenden kann, da jede Aufgabe zu sehen, vollständig blockiert den Faden bis zum vollständigen

würde ich beschreiben sie nicht als eine "harte" Grenze, aber es könnte eine Grenze geben. Der Punkt ist jedoch, dass es keine Garantien über irgendetwas gibt, also sollten Sie auf die eine oder andere Weise keine Erwartungen haben. Der springende Punkt von GCD ist, dass Sie sich mit Warteschlangen beschäftigen und dem Kernel erlauben, Threads zuzuteilen, wie es für richtig hält. Und genau das tut es. Sie haben Vorgänge in der Warteschlange geplant und sie wurden schließlich ausgeführt. Mach dir keine Sorgen, sei glücklich.

+0

Wenn das Problem ist, dass Sie eine Aktion ausführen müssen, wenn und nur wenn alle drei Operationen abgeschlossen sind, bietet GCD Möglichkeiten, dies zu tun. Aber es ist einfach albern und sinnlos, zu erraten, wie die Operationen durchgeführt werden, geschweige denn davon abhängig. – matt

1

Multicore-iOS-Geräte haben nur 2 Kerne mit je 1 Thread, also ist das Limit 2-Threads auf einmal. Die einzige Ausnahme ist das iPad Air 2 mit 3 Kernen.

Verwandte Themen