Хоча ви можете запускати цикл запуску вручну (або для асинхронного коду, який не вимагає циклу запуску, використовувати інші методи очікування, такі як диспетчерські семафори), "вбудований" спосіб, який ми надаємо на ігрових майданчиках, чекає асинхронної роботи імпортуйте 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