Embora você possa executar um loop de execução manualmente (ou, para código assíncrono que não requer um loop de execução, use outros métodos de espera como semáforos de despacho), a maneira "embutida" que fornecemos em playgrounds para esperar pelo trabalho assíncrono é importar a XCPlayground
estrutura e definir XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
. Se essa propriedade tiver sido definida, quando sua fonte de playground de nível superior terminar, em vez de parar o playground lá, continuaremos a girar o loop de execução principal, para que o código assíncrono tenha a chance de ser executado. Eventualmente encerraremos o playground após um tempo limite que é de 30 segundos, mas que pode ser configurado se você abrir o editor assistente e mostrar o assistente de cronograma; o tempo limite está no canto inferior direito.
Por exemplo, em Swift 3 (usando em URLSession
vez de NSURLConnection
):
import UIKit
import PlaygroundSupport
let 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
Ou em Swift 2:
import UIKit
import XCPlayground
let 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