Mengapa Concurrency?
Segera setelah Anda menambahkan tugas-tugas berat ke aplikasi Anda seperti pemuatan data, itu memperlambat kerja UI Anda atau bahkan membekukannya. Concurrency memungkinkan Anda melakukan 2 tugas atau lebih "secara bersamaan". Kerugian dari pendekatan ini adalah keamanan benang yang tidak selalu mudah dikendalikan. Fe ketika tugas yang berbeda ingin mengakses sumber daya yang sama seperti mencoba mengubah variabel yang sama pada utas yang berbeda atau mengakses sumber daya yang sudah diblokir oleh utas yang berbeda.
Ada beberapa abstraksi yang perlu kita waspadai.
- Antrian.
- Performa tugas Sinkron / Asinkron.
- Prioritas.
- Masalah umum.
Antrian
Harus serial atau bersamaan . Serta global atau pribadi pada saat bersamaan.
Dengan antrian serial, tugas akan diselesaikan satu per satu sementara dengan antrian bersamaan, tugas akan dilakukan secara bersamaan dan akan diselesaikan pada jadwal yang tidak terduga. Kelompok tugas yang sama akan menghabiskan lebih banyak waktu pada antrian serial dibandingkan dengan antrian bersamaan.
Anda dapat membuat antrean pribadi Anda sendiri (baik serial atau bersamaan ) atau menggunakan antrean global (sistem) yang sudah tersedia . The antrian utama adalah satu-satunya antrian seri dari semua antrian global yang .
Sangat disarankan untuk tidak melakukan tugas berat yang tidak dirujuk ke pekerjaan UI pada antrean utama (fe memuat data dari jaringan), tetapi melakukannya di antrean lain untuk menjaga UI tidak membeku dan responsif terhadap tindakan pengguna. Jika kami membiarkan UI diubah pada antrian lain, perubahan dapat dilakukan pada jadwal dan kecepatan yang berbeda dan tidak terduga. Beberapa elemen UI dapat digambar sebelum atau setelah dibutuhkan. Itu bisa merusak UI. Kita juga perlu mengingat bahwa karena antrian global adalah antrian sistem, ada beberapa tugas lain yang dapat dijalankan oleh sistem di dalamnya.
Kualitas Layanan / Prioritas
Antrian juga memiliki qos berbeda (Kualitas Layanan) yang menetapkan prioritas pelaksanaan tugas (dari yang tertinggi ke terendah di sini):
.userInteractive - antrian utama
.userInitiated - untuk tugas yang dimulai pengguna di mana pengguna menunggu beberapa respons
.utility - untuk tugas yang membutuhkan waktu dan tidak memerlukan respons segera, misalnya bekerja dengan data
.background - untuk tugas-tugas yang tidak terkait dengan bagian visual dan yang tidak ketat untuk waktu penyelesaian).
Ada juga antrian
default yang tidak mentransfer informasi qos . Jika tidak mungkin mendeteksi qos theqos akan digunakan antara .userInitiated dan .utility .
Tugas dapat dilakukan secara sinkron atau asinkron .
Fungsi sinkron mengembalikan kontrol ke antrian saat ini hanya setelah tugas selesai. Ini memblokir antrian dan menunggu sampai tugas selesai.
Fungsi asynchronous mengembalikan kontrol ke antrian saat ini tepat setelah tugas dikirim untuk dilakukan pada antrian yang berbeda. Itu tidak menunggu sampai tugas selesai. Itu tidak memblokir antrian.
Masalah Umum.
Kesalahan paling populer yang dibuat programmer saat memproyeksikan aplikasi bersamaan adalah sebagai berikut:
- Kondisi balapan - disebabkan saat aplikasi bekerja tergantung pada urutan eksekusi bagian kode.
- Inversi prioritas - saat tugas dengan prioritas lebih tinggi menunggu tugas dengan prioritas yang lebih kecil diselesaikan karena beberapa sumber daya diblokir
- Kebuntuan - ketika beberapa antrian menunggu tanpa batas untuk sumber (variabel, data, dll.) Sudah diblokir oleh beberapa antrian ini.
JANGAN PERNAH memanggil fungsi sinkronisasi pada antrian utama .
Jika Anda memanggil fungsi sinkronisasi pada antrian utama, itu akan memblokir antrian serta antrian akan menunggu tugas diselesaikan tetapi tugas tidak akan pernah selesai karena itu bahkan tidak akan bisa dimulai karena antriannya sudah diblokir. Ini disebut deadlock .
Kapan menggunakan sinkronisasi?
Kapan kita perlu menunggu sampai tugas selesai. Fe ketika kita memastikan bahwa beberapa fungsi / metode tidak dipanggil ganda. Fe kita memiliki sinkronisasi dan berusaha mencegahnya menjadi panggilan ganda sampai benar-benar selesai. Berikut beberapa kode untuk masalah ini:
Bagaimana cara mengetahui penyebab error crash report pada perangkat IOS?
DispatchQueue.main.sync
dari utas latar belakang?