Saya sudah membaca iBook dari Apple, dan tidak dapat menemukan definisi tentang itu:
Bisakah seseorang menjelaskan struktur dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Kumar KL
sumber
sumber
Jawaban:
Ide struktur yang lebih jelas:
dispatch_time_t
adalah aUInt64
. Inidispatch_queue_t
sebenarnya adalah jenis aliasNSObject
, tetapi Anda harus menggunakan metode GCD yang Anda kenal untuk mendapatkan antrian. Blok adalah penutupan Swift. Secara khusus,dispatch_block_t
didefinisikan sebagai() -> Void
, yang setara dengan() -> ()
.Contoh penggunaan:
EDIT:
Saya sarankan menggunakan fungsi @ matt yang sangat bagus
delay
.EDIT 2:
Di Swift 3, akan ada pembungkus baru untuk GCD. Lihat di sini: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
Contoh asli akan ditulis sebagai berikut dalam Swift 3:
Perhatikan bahwa Anda dapat menulis
deadlineTime
deklarasi sebagaiDispatchTime.now() + 1.0
dan mendapatkan hasil yang sama karena+
operator ditimpa sebagai berikut (sama untuk-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Ini berarti bahwa jika Anda tidak menggunakan
DispatchTimeInterval
enum
dan hanya menulis angka, diasumsikan bahwa Anda menggunakan detik.sumber
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
dalamdispatch_after(1, ...
dapat menyebabkan banyak kebingungan di sini. Orang akan berpikir itu beberapa detik, padahal sebenarnya nano-detik . Saya sarankan lihat jawaban @ brindy tentang cara membuat nomor ini dengan benar.1
kedispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
karena menyebabkan kebingungan. Orang-orang dapat berpikir bahwa Anda tidak perlu membuat dispatch_time_t di SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
di teleponlet delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
sepertinya menjadi satu-satunya cara untuk membuatnya bekerja (tidak perlu.seconds
)Saya
dispatch_after
sering menggunakan ini sehingga saya menulis fungsi utilitas tingkat atas untuk membuat sintaks lebih sederhana:Dan sekarang Anda dapat berbicara seperti ini:
Wow, bahasa tempat Anda bisa meningkatkan bahasa. Apa yang bisa lebih baik?
Pembaruan untuk Swift 3, Xcode 8 Seed 6
Tampaknya hampir tidak layak untuk diganggu, sekarang mereka telah meningkatkan sintaks pemanggilan:
sumber
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
.).1.0 ~~ { code...}
Swift 3+
Ini sangat mudah dan elegan di Swift 3+:
Jawaban Lama:
Untuk memperluas jawaban Cezary, yang akan dieksekusi setelah 1 nanosecond, saya harus melakukan yang berikut untuk mengeksekusi setelah 4 setengah detik.
Sunting: Saya menemukan bahwa kode asli saya sedikit salah. Mengetik tersirat menyebabkan kesalahan kompilasi jika Anda tidak melemparkan NSEC_PER_SEC ke Dobel.
Kalau ada yang bisa menyarankan solusi yang lebih optimal saya akan senang mendengarnya.
sumber
dispatch_get_current_queue()
. Saya menggunakandispatch_get_main_queue()
sebagai gantinya.dispatch_get_main_queue()
sudah pasti apa yang harus Anda gunakan. Akan diperbarui.Sintaks matt sangat bagus dan jika Anda perlu membatalkan pemblokiran, Anda mungkin ingin menggunakan ini:
Gunakan sebagai berikut
kredit
Tautan di atas tampaknya turun. Kode Objc asli dari Github
sumber
performSelector:afterDelay:
sekarang tersedia di Swift 2, jadi Anda bisa membatalkannya.dispatch_source_t
, karena itu adalah sesuatu yang dapat Anda batalkan).Solusi paling sederhana di Swift 3.0 & Swift 4.0 & Swift 5.0
Pemakaian
sumber
Apple memiliki cuplikan dispatch_after untuk Objective-C :
Berikut ini cuplikan yang sama yang porting ke Swift 3:
sumber
Cara lain adalah dengan memperluas Dobel seperti ini:
Maka Anda dapat menggunakannya seperti ini:
Saya suka fungsi penundaan matt tetapi hanya karena preferensi saya lebih suka membatasi penutupan lewat sekitar.
sumber
Di Swift 3.0
Antrian pengiriman
Pengiriman setelah 5 detik
sumber
Versi Swift 3.0
Fungsi penutupan berikut menjalankan beberapa tugas setelah penundaan pada utas utama.
Sebut fungsi ini seperti:
sumber
1) Tambahkan metode ini sebagai bagian dari Ekstensi UIViewController.
Panggil metode ini di VC:
2)
3)
// Formulir Ringkas
sumber
Meskipun bukan pertanyaan asli oleh OP, beberapa
NSTimer
pertanyaan terkait telah ditandai sebagai duplikat dari pertanyaan ini, jadi ada baiknya menyertakanNSTimer
jawaban di sini.NSTimer
vs.dispatch_after
NSTimer
lebih tinggi sementaradispatch_after
lebih rendah.NSTimer
lebih mudah dibatalkan. Membatalkandispatch_after
membutuhkan penulisan lebih banyak kode .Menunda tugas dengan
NSTimer
Buat sebuah
NSTimer
instance.Mulai timer dengan penundaan yang Anda butuhkan.
Tambahkan fungsi yang akan dipanggil setelah penundaan (menggunakan nama apa pun yang Anda gunakan untuk
selector
parameter di atas).Catatan
timer.invalidate()
.repeats: true
.Jika Anda memiliki acara satu kali tanpa perlu membatalkan maka tidak perlu membuat
timer
variabel instan. Berikut ini sudah cukup:Lihat jawaban lengkap saya di sini .
sumber
Untuk beberapa fungsi gunakan ini. Ini sangat membantu untuk menggunakan animasi atau pemuat aktivitas untuk fungsi statis atau Pembaruan UI apa pun.
Misalnya - Gunakan animasi sebelum tableView memuat ulang. Atau pembaruan UI lainnya setelah animasi.
sumber
Ini berhasil untuk saya.
Swift 3:
Tujuan-C:
sumber
Swift 3 & 4:
Anda dapat membuat ekstensi di DispatchQueue dan menambahkan penundaan fungsi yang menggunakan DispatchQueue asyncAfter berfungsi secara internal
menggunakan:
sumber
Pembantu lain untuk menunda kode Anda yang 100% cepat digunakan dan secara opsional memungkinkan untuk memilih utas yang berbeda untuk menjalankan kode Anda yang tertunda dari:
Sekarang Anda cukup menunda kode Anda di utas utama seperti ini:
Jika Anda ingin menunda kode Anda ke utas berbeda :
Jika Anda lebih suka Kerangka yang juga memiliki beberapa fitur yang lebih berguna maka checkout HandySwift . Anda dapat menambahkannya ke proyek Anda melalui Carthage lalu menggunakannya persis seperti pada contoh di atas, misalnya:
sumber
Saya selalu lebih suka menggunakan ekstensi daripada fungsi gratis.
Cepat 4
Gunakan sebagai berikut.
sumber
Menunda panggilan GCD menggunakan asyncAfter in swift
Kita dapat menunda sebagai ** mikrodetik , milidetik , nanodetik
sumber
Dalam Swift 4
Gunakan cuplikan ini:
sumber
The
dispatch_after(_:_:_:)
Fungsi mengambil tiga parameter:The
dispatch_after(_:_:_:)
fungsi memanggil blok atau penutupan pada antrian pengiriman yang dilewatkan ke fungsi setelah penundaan diberikan. Perhatikan bahwa penundaan dibuat menggunakandispatch_time(_:_:)
fungsi. Ingat ini karena kami juga menggunakan fungsi ini di Swift.Saya sarankan untuk pergi melalui tutorial tutorial Pengiriman Raywenderlich
sumber
Di Swift 5, gunakan di bawah ini:
sumber
gunakan kode ini untuk melakukan beberapa tugas terkait UI setelah 2,0 detik.
Versi Swift 3.0
Fungsi penutupan berikut menjalankan beberapa tugas setelah penundaan pada utas utama.
Sebut fungsi ini seperti:
sumber
Sekarang lebih dari sekadar gula sintaksis untuk kiriman asinkron di Grand Central Dispatch (GCD) di Swift.
tambahkan Podfile
Lalu, Anda bisa menggunakannya seperti ini.
sumber
Swift 4 memiliki cara yang cukup singkat untuk melakukan ini:
sumber
Berikut ini adalah versi sinkron dari asyncAfter di Swift:
Bersama dengan asinkron:
sumber