Bei vielen Cocoa- und CocoaTouch-Methoden sind Abschlussrückrufe als Blöcke in Objective-C und Closures in Swift implementiert. Wenn Sie diese jedoch auf dem Spielplatz ausprobieren, wird die Fertigstellung niemals aufgerufen. Beispielsweise:
// 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)
}
}
Ich kann die Konsolenausgabe in meiner Playground-Timeline sehen, aber die println
in meinem Abschlussblock werden nie aufgerufen ...
quelle
XCPlayground
Framework ab DP4 jetzt auch für iOS-Spielplätze verfügbar ist.XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
import PlaygroundSupport
undPlaygroundPage.current.needsIndefiniteExecution = true
Diese API wurde in Xcode 8 erneut geändert und in Folgendes verschoben
PlaygroundSupport
:Diese Änderung wurde in Sitzung 213 auf der WWDC 2016 erwähnt .
quelle
PlaygroundPage.current.finishExecution()
.Ab XCode 7.1
XCPSetExecutionShouldContinueIndefinitely()
ist veraltet. Der richtige Weg, dies jetzt zu tun, besteht darin, zuerst eine unbestimmte Ausführung als Eigenschaft der aktuellen Seite anzufordern:… Geben Sie dann an, wann die Ausführung abgeschlossen ist mit:
Beispielsweise:
quelle
Der Grund, warum die Rückrufe nicht aufgerufen werden, ist, dass RunLoop nicht auf dem Spielplatz (oder im REPL-Modus) ausgeführt wird.
Eine etwas ruckelige, aber effektive Möglichkeit, die Rückrufe zum Laufen zu bringen, besteht darin, ein Flag zu verwenden und dann den Runloop manuell zu iterieren:
Dieses Muster wurde häufig in Komponententests verwendet, bei denen asynchrone Rückrufe getestet werden müssen, z. B.: Muster zum Testen von asynchronen Warteschlangen, die nach Abschluss die Hauptwarteschlange aufrufen
quelle
Die neuen APIs für XCode8, Swift3 und iOS 10 sind:
quelle
Swift 4, Xcode 9.0
quelle
Swift 3, Xcode 8, iOS 10
Anmerkungen:
Teilen Sie dem Compiler mit, dass für die Spielplatzdatei eine "unbestimmte Ausführung" erforderlich ist.
Beenden Sie die Ausführung manuell über einen Aufruf an
PlaygroundSupport.current.completeExecution()
Ihren Completion-Handler.Möglicherweise treten Probleme mit dem Cache-Verzeichnis auf. Um dieses Problem zu beheben, müssen Sie den Singleton UICache.shared manuell neu instanziieren.
Beispiel:
quelle
quelle