Banyak metode Cocoa dan CocoaTouch memiliki callback penyelesaian yang diimplementasikan sebagai blok di Objective-C dan Closures di Swift. Namun, saat mencobanya di Playground, penyelesaiannya tidak pernah dibatalkan. Sebagai contoh:
// 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)
}
}
Saya dapat melihat output konsol di timeline Playground saya, tetapi println
blok penyelesaian saya tidak pernah dipanggil ...
sumber
XCPlayground
kerangka sekarang tersedia untuk iOS Playgrounds juga.XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
import PlaygroundSupport
danPlaygroundPage.current.needsIndefiniteExecution = true
API ini berubah lagi di Xcode 8 dan dipindahkan ke
PlaygroundSupport
:Perubahan ini disebutkan dalam Sesi 213 di WWDC 2016 .
sumber
PlaygroundPage.current.finishExecution()
.Pada XCode 7.1,
XCPSetExecutionShouldContinueIndefinitely()
sudah tidak digunakan lagi. Cara yang benar untuk melakukannya sekarang adalah dengan terlebih dahulu meminta eksekusi tak terbatas sebagai properti halaman saat ini:… Lalu tunjukkan saat eksekusi telah selesai dengan:
Sebagai contoh:
sumber
Alasan callback tidak dipanggil adalah karena RunLoop tidak berjalan di Playground (atau dalam mode REPL).
Cara yang agak janky, tetapi efektif, untuk membuat callback beroperasi adalah dengan sebuah flag dan kemudian melakukan iterasi secara manual pada runloop:
Pola ini sering digunakan dalam Pengujian Unit yang perlu menguji callback asinkron, misalnya: Pola untuk pengujian unit antrean asinkron yang memanggil antrean utama saat penyelesaian
sumber
API baru untuk XCode8, Swift3 dan iOS 10 adalah,
sumber
Swift 4, Xcode 9.0
sumber
Swift 3, xcode 8, iOS 10
Catatan:
Beri tahu kompiler bahwa file taman bermain memerlukan "eksekusi tak terbatas"
Hentikan eksekusi secara manual melalui panggilan ke
PlaygroundSupport.current.completeExecution()
dalam penangan penyelesaian Anda.Anda mungkin mengalami masalah dengan direktori cache dan untuk mengatasinya Anda perlu secara manual membuat ulang UICache.shared singleton.
Contoh:
sumber
sumber