2017-07-05 1 views
0

ist es möglich, eine For-In-Schleife zu stoppen und sie und die angehaltene Position mit einer Taste fortzusetzen.Swift Stop Loop und weiter mit einer Taste

ich meine so etwas wie dieses:

for x in 0..<5 { 

    if x == 3 { 
     // show a button 
     // this button have to be pressed 
     // which do some tasks 
     // when all tasks are finished > 
     // continue this loop at the stopped point 
    } 
} 

ist das möglich? wenn ja, wie?

Antwort

0

Kurze Antwort: Verwenden Sie eine Semaphore

Lange Antwort:

Ihre Situation ist ein Beispiel für den allgemeineren Fall, wie eine Berechnung anzuhalten, seinen aktuellen Zustand (lokale Variablen zu speichern, Call-Stack usw.), und später, um es vom selben Punkt wieder aufzunehmen, wenn alle Zustände wiederhergestellt sind.

Einige Sprachen/Systeme bieten Koroutinen dies zu unterstützen, andere die eher esoterischen Anruf mit aktuellen Fortsetzung, weder stehen Ihnen zur Verfügung (derzeit) Swift ...

Was Sie tun müssen, ist Groß Zentraler Versand (GCD), bereitgestellt in Swift durch Dispatch, der Unterstützung für die Ausführung gleichzeitiger asynchroner Aufgaben und die Synchronisierung zwischen ihnen bietet. Andere Nebenläufigkeitsmechanismen wie pthread sind ebenfalls verfügbar, aber GCD wird tendenziell empfohlen.

GCD Mit einen Umriss einer Lösung ist:

  • Führen Sie Schleife als asynchrone gleichzeitige Aufgabe. Es muss nicht auf dem Haupt-Thread werden die Ausführung, oder Sie werden Deadlock ...
  • Wenn Sie anhalten möchten:
    • Erstellen einer Semaphore
    • Starten Sie eine andere Asynchron-Aufgabe auf die Schaltfläche angezeigt werden, führen Sie die anderen Jobs usw. Diese neue Aufgabe muss Signal das Semaphor, wenn es fertig ist. Die neue Aufgabe kann den Haupt-Thread zum Ausführen von UI-Operationen aufrufen.
    • Ihre Schleife Aufgabe wartet auf dem Semaphor, dies wird die Schleife Aufgabe blockieren, bis die Schaltfläche Task es signalisiert. Dies kann kompliziert

klingen, aber mit Swift Block Syntax und Dispatch es ist ganz einfach. Sie müssen jedoch zuerst auf GCD lesen!

Alternativ können Sie fragen, ob Sie Ihre Lösung in mehrere Teile umstrukturieren können, so dass das Speichern/Wiederherstellen des aktuellen Status nicht erforderlich ist. Sie könnten Designs wie Continuation Passing-Stil nützlich finden, die wiederum ist ganz einfach mit Swifts Blöcke.

HTH