Bagaimana saya bisa membuat kode saya menunggu hingga tugas di DispatchQueue selesai? Apakah itu membutuhkan CompletionHandler atau sesuatu?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
Saya menggunakan Xcode 8.2 dan menulis di Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Bartosz Woźniak
sumber
sumber
wait
pendekatan (jika tidak ada masalah bagi Anda untuk memblokir, misalnya jika Anda tidak berada di thread utama) atau berikan penangan penyelesaian atau gunakan pendekatan notify di kelas pemanggil Anda.group.enter
luar blok asinkron? Bukankah seharusnya itu menjadi tanggung jawab setiap blok untuk masuk dan keluar dari grup?wait
menunggu sampaienter
danleave
panggilan seimbang. Jika Anda menempatkanenter
di penutupan,wait
tidak akan menunggu karenaenter
belum disebut belum dan dengan demikian jumlahenter
danleave
panggilan yang seimbang (# masuk == 0, # leav == 0).XCTTestExpectation
s sebagai gantinya. Lihat kode contoh iniDi Swift 3, tidak diperlukan penangan penyelesaian saat
DispatchQueue
menyelesaikan satu tugas. Selanjutnya Anda dapat mencapai tujuan Anda dengan cara yang berbedaSalah satu caranya adalah ini:
Ini akan menunggu sampai loop selesai tetapi dalam hal ini utas utama Anda akan diblokir.
Anda juga bisa melakukan hal yang sama seperti ini:
Satu hal terakhir: Jika Anda ingin menggunakan completeHandler saat tugas Anda selesai menggunakan DispatchQueue, Anda bisa menggunakan
DispatchWorkItem
.Berikut adalah contoh bagaimana menggunakan
DispatchWorkItem
:sumber
Gunakan grup pengiriman
sumber
DispatchQueue.global().async{}
tidak akan memblokir antrean utama.Solusi cepat versi 5
func myCriticalFunction () {var value1: String? var value2: String?
}
sumber
Cepat 4
Anda dapat menggunakan Fungsi Async untuk situasi ini. Saat Anda menggunakan
DispatchGroup()
, Terkadang kebuntuan mungkin terjadi.sumber