Хотя вы можете запускать цикл выполнения вручную (или для асинхронного кода, который не требует цикла запуска, использовать другие методы ожидания, такие как семафоры отправки), «встроенный» способ, который мы предоставляем на игровых площадках для ожидания асинхронных работа заключается в том, чтобы импортировать фрейм XCPlayground
и установить XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
. Если это свойство было установлено, когда ваш верхний уровень игровой площадки заканчивается, вместо остановки игровой площадки мы будем продолжать вращать основной цикл запуска, поэтому асинхронный код имеет шанс запустить. В конечном итоге мы закончим игровую площадку после тайм-аута, который по умолчанию составляет 30 секунд, но который можно настроить, если вы откроете помощник редактора и покажите помощника временной шкалы; таймаут находится в нижнем правом углу.
Например, в Swift 3 (используя URLSession
вместо 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
Или в 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