2016-03-22 6 views
-1

Ich arbeite mit Sprite Kit für ein OS X-Projekt und ich konnte nicht herausfinden, wie man meine While-Schleife bis zu einem Mausklick pausiert. Was ich will, ist etwas in der Art:Warten auf Mausklick innerhalb von While Loop

while (i < 50){ 
    print(i) 
    i += 1 
    waitForMouseClick() 
} 
+0

Das wird den Haupt-Thread blockieren und Ihre Anwendung wird den Mausklick nicht empfangen können. – EmilioPelaez

+0

Haben Sie irgendwelche Vorschläge, um diese Art von Verhalten zu erreichen? – ergbil

+1

Das Verhalten, nach dem Sie suchen, ist ein bisschen komplex. Sie müssen die Hauptereignisschleife Ihrer Anwendung so lange ausführen lassen, dass Mausereignisse an Ihr Programm gesendet werden, während Sie gleichzeitig den Kontext Ihrer Schleife verfolgen. Im Großen und Ganzen scheint es, dass Sie einige Zeit damit verbringen müssen, etwas mehr über die Ereignisbehandlung von Betriebssystemen zu lernen. Das oder Sie müssen in Ihrer Frage einen größeren Zusammenhang angeben, welchen Effekt Sie erzielen möchten. –

Antwort

1

Ich löste es mit einer GCD Hintergrundwarteschlange und einem Semaphor. Könnte für andere Leute, die das lesen, hilfreich sein.

// CREATE A BACKGROUND QUEUE AND SEMAPHORE 
let bgQueue = dispatch_queue_create("myQueue", nil) 
let semaphore = dispatch_semaphore_create(0) 

override func didMoveToView(view: SKView) { 
    //DISPATCH CODE BLOCK TO QUEUE 
    dispatch_async(bgQueue, { 
     //THIS WILL GRAB YOUR SEMAPHORE 
     dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_NOW) 
     var i: Int = 0 
     while (i<50){ 
      i += 1 
      //BLOCK 
      dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER) 
      print(i) 
     } 
    }) 
} 

override func mouseDown(theEvent: NSEvent) { 
    //RELEASE SEMAPHORE 
    dispatch_semaphore_signal(semaphore) 
}