How do I run Asynchronous callbacks in Playground How do I run Asynchronous callbacks in Playground swift swift

How do I run Asynchronous callbacks in Playground


While you can run a run loop manually (or, for asynchronous code that doesn't require a run loop, use other waiting methods like dispatch semaphores), the "built-in" way we provide in playgrounds to wait for asynchronous work is to import the XCPlayground framework and set XCPlaygroundPage.currentPage.needsIndefiniteExecution = true. If this property has been set, when your top level playground source finishes, instead of stopping the playground there we will continue to spin the main run loop, so asynchronous code has a chance to run. We will eventually terminate the playground after a timeout which defaults to 30 seconds, but which can be configured if you open the assistant editor and show the timeline assistant; the timeout is in the lower-right.

For example, in Swift 3 (using URLSession instead of NSURLConnection):

import UIKitimport PlaygroundSupportlet url = URL(string: "http://stackoverflow.com")!URLSession.shared.dataTask(with: url) { data, response, error in    guard let data = data, error == nil else {        print(error ?? "Unknown error")        return    }    let contents = String(data: data, encoding: .utf8)    print(contents!)}.resume()PlaygroundPage.current.needsIndefiniteExecution = true

Or in Swift 2:

import UIKitimport XCPlaygroundlet url = NSURL(string: "http://stackoverflow.com")let request = NSURLRequest(URL: url!)NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.currentQueue()) { response, maybeData, error in    if let data = maybeData {        let contents = NSString(data:data, encoding:NSUTF8StringEncoding)        println(contents)    } else {        println(error.localizedDescription)    }}XCPlaygroundPage.currentPage.needsIndefiniteExecution = true


This API changed again in Xcode 8 and it was moved to the PlaygroundSupport:

import PlaygroundSupportPlaygroundPage.current.needsIndefiniteExecution = true

This change was mentioned in Session 213 at WWDC 2016.


As of XCode 7.1, XCPSetExecutionShouldContinueIndefinitely() is deprecated. The correct way to do this now is to first request indefinite execution as a property of the current page:

import XCPlaygroundXCPlaygroundPage.currentPage.needsIndefiniteExecution = true

…then indicate when execution has finished with:

XCPlaygroundPage.currentPage.finishExecution()

For example:

import Foundationimport XCPlaygroundXCPlaygroundPage.currentPage.needsIndefiniteExecution = trueNSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://stackoverflow.com")!) {    result in    print("Got result: \(result)")    XCPlaygroundPage.currentPage.finishExecution()}.resume()