Petunjuk: Jangan membuat sarangnya!
Kami memiliki kasus di mana kami harus menunggu beberapa API selesai dan kemudian memproses logika lebih lanjut atau memperbarui UI sesuai kebutuhan. Kita akan melihat apa yang biasa saya (dan mungkin banyak orang lain) lakukan dan kemudian pendekatan terbaik untuk digunakan dengan Swift.
Masalah
Seperti yang Anda lihat di bawah, kami memanggil dua API, lalu kami ingin memperbarui UI. Kami akan menggunakan Alamofire untuk menyederhanakan permintaan API. Kami juga melacak berapa lama waktu yang diperlukan untuk menyelesaikan kedua API.
Catatan: Jika Anda mencobanya sendiri, jangan lupa untuk mengatur Pengaturan Keamanan Transportasi Aplikasi ➡ Izinkan Pemuatan Sewenang-wenang ke YES
di file Info.plist
Anda.
Kode
Penjelasan kode
- Titik akhir adalah struktur yang menyatukan URL ke API yang ingin kita panggil nanti
IBOutlet
diperlukan untuk mengakses objek UI untuk memperbaruinya ketika status respons API berubahstartTimeInterval
adalah referensi saat kita memulai panggilan API pertama kitaisWaiting
sedang melacak jika ada permintaan API yang kami tunggu tanggapannya. Dan ketika status berubah, UI akan diperbarui.- Di
viewDidLoad()
, kami memanggil dua API menggunakan Alamofire. Harap diingat bahwa kami sedang menyusunnya. Jadi permintaan API tersebut akan dijalankan satu demi satu, tidak secara bersamaan. updateUI()
sebenarnya tentang memperbarui label danactivityIndicatorView
dengan teks dan animasi yang sesuai
Papan cerita
Jika Anda bertanya-tanya seperti apa tampilan storyboard kami, jumlahnya diminimalkan saja. Itu hanya label dan indikator aktivitas.
Solusi: 'Grup Pengiriman'
Sekarang masukkan (permainan kata-kata!) DispatchGroup
. Ini dirancang khusus untuk kasus seperti ini, mengelompokkan beberapa tugas dan menunggu sampai selesai. Ketika semua tugas selesai, ia dapat memberi tahu melalui penutupan Swift sehingga kita dapat melanjutkan lebih jauh.
Kode
Penjelasan kode
- Kami telah menambahkan
DispatchGroup
contoh - Kami menggunakan metode
enter()
di grup. Ini untuk memberi tahuDispatchGroup
bahwa kita sedang menunggu sesuatu. BayangkanDispatchGroup
seperti menghitung berapa kalienter()
dipanggil. Jadi penghitungnya akan bertambah satu setiap kalienter()
dipanggil. - Kami telah menghapus panggilan API bertingkat dan cara kami memanggil kedua API secara bersamaan. Secara keseluruhan, hal ini membuat waktu tunggu API menjadi lebih singkat. Di sini, perhatikan bahwa kami menggunakan metode
leave()
untuk memberi tahuDisaptchGroup
bahwa tugas telah selesai, artinya respons API telah diterima. Dengan memanggil metodeleave()
, kita akan mengurangi penghitung imajiner kita sebanyak satu. Segera setelah penghitung imajiner kita mencapai nol,DispatchGroup
akan memanggil metodenotify()
.
Catatan:Setiap panggilan enter()
juga harus disertai dengan panggilan leave()
. Jika tidak, metode notify()
tidak akan dieksekusi sama sekali.
Anda mungkin tergoda untuk hanya memanggil enter()
tepat sebelum panggilan API, seperti di bawah ini:
Namun saya menyarankan Anda untuk menghindari hal itu, karena sangat jarang, jika respons API terlalu cepat, grup akan segera masuk dan keluar, dan jika tidak ada tugas terjadwal lainnya dalam grup, grup akan memanggil notify()
metode dan tidak menunggu tugas Anda berikutnya.
Jadi, menurut pendapat pribadi saya, kita harus mengelompokkan enter()
panggilan bersama jika kita tahu berapa banyak tugas yang akan kita mulai sebelumnya.
Kesimpulan
Besar! Hari ini kita mempelajari cara menggunakan DispatchGroup
untuk menunggu operasi asinkron. Ada berbagai cara untuk menggunakan DispatchGroup
, tapi itu untuk hari lain.
Terima kasih telah membaca.