Konkurensi dengan Grand Central Dispatch

Jan 24 2023
Apa itu GCD? Grand Central Dispatch dibuat oleh Apple lebih dari 10 tahun yang lalu sebagai abstraksi untuk membantu pengembang menulis kode multi-utas tanpa membuat dan mengelola utas secara manual. Konkurensi berarti bahwa dua tugas dapat dimulai, dijalankan, dan diselesaikan dalam slot waktu yang tumpang tindih.

Apa itu GCD?

Grand Central Dispatch dibuat oleh Apple lebih dari 10 tahun yang lalu sebagai abstraksi untuk membantu pengembang menulis kode multi-utas tanpa membuat dan mengelola utas secara manual.

Konkurensi berarti bahwa dua tugas dapat dimulai, dijalankan, dan diselesaikan dalam slot waktu yang tumpang tindih. Ada tiga cara untuk mencapai konkurensi di iOS, utas, antrean pengiriman, dan antrean operasi.

“Alih-alih melakukan threading secara langsung, Anda menggunakan GCD untuk menjadwalkan tugas kerja dan sistem akan melakukannya untuk Anda, memanfaatkan sumber dayanya secara maksimal. GCD akan mengambil alih pembuatan utas yang diperlukan dan menjadwalkan tugas Anda di utas ini, mengalihkan beban pengelolaan utas dari pengembang ke sistem.”

Keuntungan terbesar GCD adalah Anda tidak perlu memikirkan sumber daya perangkat keras saat menulis kode bersamaan.

“Semua antrean pengiriman adalah struktur data masuk pertama, keluar pertama (FIFO), jadi tugas selalu dimulai dengan urutan yang sama saat ditambahkan.”

Pada dasarnya ada tiga cara konkurensi di iOS:

  • benang
  • antrian pengiriman
  • antrian operasi

“Kerugian dari thread adalah bahwa mereka menurunkan beban untuk menciptakan solusi yang dapat diskalakan kepada pengembang. Anda harus memutuskan berapa banyak utas yang akan dibuat dan menyesuaikan nomor tersebut secara dinamis saat kondisi berubah. Selain itu, aplikasi menanggung sebagian besar biaya yang terkait dengan pembuatan dan pemeliharaan utas yang digunakannya.”

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                       selector:@selector(myThreadMainMethod:)
                                       object:nil];
[myThread start];

“A DispatchQueueadalah lapisan abstraksi di atas antrean GCD yang memungkinkan Anda menjalankan tugas secara asinkron dan bersamaan dalam aplikasi Anda. Tugas selalu dijalankan sesuai urutan penambahannya ke antrean.”

Antrian Serial dan Antrian Bersamaan

“Antrean Pengiriman serial hanya melakukan satu tugas pada satu waktu. Antrian serial sering digunakan untuk menyinkronkan akses ke nilai atau sumber daya tertentu untuk mencegah terjadinya data race.”

let serialQueue = DispatchQueue(label: "serialQueue")

serialQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
serialQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 1 finished
Task 2 started
Task 2 finished

let concurrentQueue = DispatchQueue(label: "concurrentQueue", 
                                    attributes: .concurrent)

concurrentQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
concurrentQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished

“Antrean operasi adalah Kakao yang setara dengan antrean pengiriman bersamaan dan diimplementasikan oleh kelas NSOperationQueue. Tidak seperti antrean pengiriman, antrean operasi tidak terbatas pada pelaksanaan tugas dalam urutan FIFO dan mendukung pembuatan grafik urutan eksekusi yang rumit untuk tugas Anda.”

NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperation:anOperation]; 
[myQueue addOperationWithBlock:^{
   /* Do something. */
}];

Antrean pengiriman utama adalah antrean serial yang tersedia secara global yang menjalankan tugas di utas utama aplikasi.

“Anda dapat mulai melakukan pekerjaan berat di antrean latar belakang dan mengirim kembali ke antrean utama setelah selesai.”

DispatchQueue.main.async {
    self.tableView.reloadData()
}

Selamat coding…