Хотя вы можете запустить цикл выполнения вручную (или, для асинхронного кода, который не требует цикла выполнения, используйте другие методы ожидания, такие как семафоры отправки), «встроенный» способ, который мы предлагаем на игровых площадках для ожидания асинхронной работы, заключается в том, чтобы импортировать 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