Dalam aplikasi saya, saya memiliki fungsi yang membuat NSRURLSession dan mengirimkan NSURLRequest menggunakan
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
Di blok penyelesaian untuk tugas ini, saya perlu melakukan beberapa perhitungan yang menambahkan UIImage ke viewcontroller panggilan. Saya memiliki fungsi yang dipanggil
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
yang melakukan perhitungan penambahan UIImage. Jika saya mencoba menjalankan kode tambah-tampilan di dalam blok penyelesaian, Xcode melempar kesalahan yang mengatakan bahwa saya tidak dapat menggunakan mesin tata letak saat dalam proses latar belakang. Jadi saya menemukan beberapa kode pada SO yang mencoba mengantri metode pada utas utama:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Namun, saya tidak tahu bagaimana cara menambahkan parameter "acceptAddr" dan "numberBTC" ke pemanggilan fungsi ini. Bagaimana saya melakukan ini, atau bisakah seseorang menyarankan cara optimal untuk menambahkan pemanggilan metode ke antrian utama aplikasi?
Versi Swift 3+ & Swift 4:
Swift 3 dan Xcode 9.2:
sumber
Cepat 2
Menggunakan Trailing Closures ini menjadi:
Trailing Closures adalah gula sintaksis Swift yang memungkinkan pendefinisian penutupan di luar lingkup parameter fungsi. Untuk informasi lebih lanjut lihat Trailing Closures in Swift 2.2 Panduan Bahasa Pemrograman.
Dalam hal dispatch_async API adalah
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
karenadispatch_block_t
tipe alias untuk() -> Void
- Sebuah penutupan yang menerima 0 parameter dan tidak memiliki nilai kembali, dan blok menjadi parameter terakhir dari fungsi kita dapat mendefinisikan penutupan di lingkup luardispatch_async
.sumber
Muat ulang collectionView di Main Thread
sumber
Berikut sintaks gaya Swifty / Cocoa yang lebih bagus (IMO) untuk mencapai hasil yang sama dengan jawaban lainnya:
Atau Anda bisa mengambil pustaka Async Swift yang populer dengan kode yang lebih sedikit dan lebih banyak fungsi:
sumber
OperationQueue.main.addOperation({ }
Cara yang tepat untuk melakukan ini adalah dengan menggunakan dispatch_async di main_queue, seperti yang saya lakukan pada kode berikut
sumber
Inilah fungsi global kecil yang menyenangkan yang dapat Anda tambahkan untuk sintaksis yang lebih bagus:
Dan penggunaan
sumber
sumber
Jangan lupa untuk melemahkan diri sendiri jika Anda menggunakan diri di dalam penutupan.
sumber