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 berubah
  • startTimeInterval adalah referensi saat kita memulai panggilan API pertama kita
  • isWaiting 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 dan activityIndicatorView 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 tahu DispatchGroup bahwa kita sedang menunggu sesuatu. Bayangkan DispatchGroup seperti menghitung berapa kali enter() dipanggil. Jadi penghitungnya akan bertambah satu setiap kali enter() 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 tahu DisaptchGroup bahwa tugas telah selesai, artinya respons API telah diterima. Dengan memanggil metode leave(), kita akan mengurangi penghitung imajiner kita sebanyak satu. Segera setelah penghitung imajiner kita mencapai nol, DispatchGroup akan memanggil metode notify().

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.

Unduh kodenya



Sumber daya