Xcode Playground mit asynchronen Methoden

Will man mit dem Xcode Playground ein wenig expirimentieren und dabei asynchrone Methoden verwenden, stößt man sehr schnell an seine Grenzen.
Es kommen keine Callbacks an und damit ist das Testen schwierig.

Der Grund dafür ist einfach: Wurde die aktuelle Seite im Playground einmal abgearbeitet, werden auch alle parallel laufenden Threads beendet bzw. pausiert.

Abhilfe ist ganz einfach. Man kann der aktuellen Playground - Seite sagen das die Ausführungen weiter laufen soll.
Dafür muss die Eigenschaft "needsIndefiniteExecution" der aktuellen Playground Seite auf true gesetzt werden.

Hier die komplette Anweisung:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

Nun kommen auch Callbacks von anderen Threads zurück.
Damit die Seite nicht durchgehend ausgeführt wird, kann die Ausführung mit folgender Anweisung beendet werden:
XCPlaygroundPage.currentPage.finishExecution()


Hier ein komplettes Beispiel für einen WebRequest im Xcode Playground:

//: Sample for HTTP Request

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

var str = "Hello, playground"

let url = NSURL(string: "http://danielbedarf.blogspot.com")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
    (data, response, error) in
   
    print(NSString(data: data!, encoding: NSUTF8StringEncoding))
   
    //stop the execution
    XCPlaygroundPage.currentPage.finishExecution()

}

//start the http request
task.resume()


Hinweis: die Property needIndefiniteExecution ist der Nachfolger der Funktion "XCPSetExecutionShouldContinueIndefinitely()".


Keine Kommentare: