Perbandingan antara berbagai pendekatan di swift 3.0
1. Tidur
Metode ini tidak memiliki panggilan balik. Letakkan kode langsung setelah baris ini untuk dieksekusi dalam 4 detik. Ini akan menghentikan pengguna dari pengulangan dengan elemen UI seperti tombol tes sampai waktu hilang. Meskipun tombolnya agak beku saat tidur, elemen lain seperti indikator aktivitas masih berputar tanpa beku. Anda tidak dapat memicu tindakan ini lagi selama tidur.
sleep(4)
print("done")//Do stuff here
2. Pengiriman, Lakukan dan Timer
Tiga metode ini bekerja dengan cara yang sama, mereka semua berjalan di latar belakang dengan panggilan balik, hanya dengan sintaks yang berbeda dan fitur yang sedikit berbeda.
Pengiriman biasanya digunakan untuk menjalankan sesuatu di utas latar belakang. Ini memiliki panggilan balik sebagai bagian dari panggilan fungsi
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Perform sebenarnya adalah timer yang disederhanakan. Ini mengatur timer dengan penundaan, dan kemudian memicu fungsi dengan pemilih.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
Dan akhirnya, timer juga menyediakan kemampuan untuk mengulangi panggilan balik, yang tidak berguna dalam kasus ini
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
Untuk ketiga metode ini, ketika Anda mengklik tombol untuk memicu mereka, UI tidak akan membeku dan Anda diizinkan untuk mengkliknya lagi. Jika Anda mengklik tombol lagi, timer lain sudah diatur dan panggilan balik akan dipicu dua kali.
Kesimpulannya
Tidak satu pun dari empat metode ini yang bekerja dengan cukup baik sendiri. sleep
akan menonaktifkan interaksi pengguna, sehingga layar " membeku " (tidak benar-benar) dan menghasilkan pengalaman pengguna yang buruk. Tiga metode lainnya tidak akan membekukan layar, tetapi Anda dapat memicu mereka beberapa kali, dan sebagian besar waktu, Anda ingin menunggu sampai Anda mendapatkan panggilan kembali sebelum mengizinkan pengguna untuk melakukan panggilan lagi.
Jadi desain yang lebih baik akan menggunakan salah satu dari tiga metode async dengan pemblokiran layar. Ketika pengguna mengklik tombol, tutup seluruh layar dengan beberapa tampilan transparan dengan indikator aktivitas berputar di atas, memberi tahu pengguna bahwa klik tombol sedang ditangani. Kemudian hapus tampilan dan indikator dalam fungsi panggilan balik, memberi tahu pengguna bahwa tindakan tersebut ditangani dengan benar, dll.