De nombreuses méthodes Cocoa et CocoaTouch ont des rappels d'achèvement implémentés sous forme de blocs dans Objective-C et de fermetures dans Swift. Cependant, lorsque vous les essayez dans Playground, la complétion n'est jamais appelée. Par exemple:
// Playground - noun: a place where people can play
import Cocoa
import XCPlayground
let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() {
response, maybeData, error in
// This block never gets called?
if let data = maybeData {
let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
println(contents)
} else {
println(error.localizedDescription)
}
}
Je peux voir la sortie de la console dans ma timeline Playground, mais les println
dans mon bloc de complétion ne sont jamais appelés ...
la source
XCPlayground
cadre est désormais également disponible pour iOS Playgrounds.XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
import PlaygroundSupport
etPlaygroundPage.current.needsIndefiniteExecution = true
Cette API a de nouveau changé dans Xcode 8 et elle a été déplacée vers le
PlaygroundSupport
:Ce changement a été mentionné lors de la session 213 de la WWDC 2016 .
la source
PlaygroundPage.current.finishExecution()
.Depuis XCode 7.1,
XCPSetExecutionShouldContinueIndefinitely()
est obsolète. La bonne façon de procéder maintenant est de demander d'abord une exécution indéfinie en tant que propriété de la page en cours:… Puis indiquez la fin de l'exécution avec:
Par exemple:
la source
La raison pour laquelle les rappels ne sont pas appelés est que le RunLoop ne fonctionne pas dans Playground (ou en mode REPL d'ailleurs).
Un moyen quelque peu capricieux, mais efficace, de faire fonctionner les rappels est d'utiliser un indicateur, puis d'itérer manuellement sur la boucle d'exécution:
Ce modèle a souvent été utilisé dans les tests unitaires qui doivent tester les rappels asynchrones, par exemple: Modèle pour la file d'attente asynchrone de test unitaire qui appelle la file d'attente principale à la fin
la source
Les nouvelles API comme pour XCode8, Swift3 et iOS 10 sont,
la source
Swift 4, Xcode 9.0
la source
Swift 3, xcode 8, iOS 10
Remarques:
Dites au compilateur que le fichier de terrain de jeu nécessite une "exécution indéfinie"
Terminez manuellement l'exécution via un appel à l'
PlaygroundSupport.current.completeExecution()
intérieur de votre gestionnaire d'achèvement.Vous pouvez rencontrer des problèmes avec le répertoire de cache et pour résoudre ce problème, vous devrez ré-instancier manuellement le singleton UICache.shared.
Exemple:
la source
la source