GCD (Grand Central Dispatch) чист ва чӣ тавр дар таҳияи iOS истифода мешавад?
sobes.tech AI
Ҷавоб аз AI
GCD (Grand Central Dispatch) технологияи пасти сатҳи пасти параллелизм аз ҷониби Apple мебошад, ки дар асоси C сохта шудааст, аммо бо фароҳои қулай дар Swift ва Objective-C. Он механизмро барои идоракунии сатрҳои кор (work items) ва иҷрои онҳо ба таври асинхрон ё синхрон дар ядроҳои дастрас пешниҳод мекунад.
Концептҳои асосии GCD:
-
Dispatch Queues: Сатрҳо барои иҷрои вазифаҳо. Ду навъ доранд:
- Serial Queues: вазифаҳо ба таври пайдарпай иҷро мешаванд. Ин ҳолатҳоро дар вақти дастрасӣ ба захираҳои умумӣ пешгирӣ мекунад.
- Concurrent Queues: вазифаҳо дар параллел иҷро мешаванд (аммо тартиби оғоз ва анҷом додани онҳо кафолат дода намешавад). Барои иҷрои вазифаҳои мустақил, ки метавонанд ҳамзамон иҷро шаванд, истифода мешаванд.
- Main Queue: Сатр махсуси пайдарпай, ки бо ҷараёни асосии барнома алоқаманд аст. Барои навсозии UI истифода мешавад. Ҳамаи вазифаҳои вобаста ба UI бояд дар ҳамин сатр иҷро шаванд.
-
Work Items (Closures/Blocks): Блокҳои коди, ки вазифаи алоҳидаи иҷроишро намояндагӣ мекунанд.
-
Dispatch Group: Имкон медиҳад, ки вазифаҳо гурӯҳбандӣ шаванд ва огоҳӣ дар бораи анҷоми ҳама онҳо гирифта шавад.
-
Dispatch Semaphores: Примитиви ҳамоҳангсозӣ барои идоракунии дастрасӣ ба захираҳои маҳдуд.
Истифода дар таҳияи iOS:
-
Иҷрои амалҳои вазнин дар пасзамина: Ҳаракати вазифаҳо, масалан, дархостҳои шабакавӣ, коркарди тасвирҳо, кор бо базаҳои додаҳо, аз сатрҳои асосӣ ба сатрҳои пасзамина (масалан, сатрҳои глобалии параллел) барои пешгирии баста шудани UI.
// Иҷрои вазифаи асинхронӣ дар сатрҳои глобалӣ DispatchQueue.global(qos: .userInitiated).async { // Амали вазнин let result = performHeavyOperation() // Навсозии UI дар ҷараёни асосӣ DispatchQueue.main.sync { updateUI(with: result) } } -
Навсозии UI: Ҳамеша амалҳои тағир додани интерфейси корбариро дар сатрҳои асосӣ иҷро кунед.
// Навсозии UI дар ҷараёни асосӣ DispatchQueue.main.async { self.label.text = "Навсозӣ шуд!" } -
Секвенссозии дастрасӣ ба маълумот: Истифодаи сатрҳои пайдарпайи корбарӣ барои дастрасии ҳамоҳангшуда ба захираҳои умумӣ.
// Мисоли сатрҳои пайдарпай барои дастрасии ҳамоҳангшуда let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess") func updateSharedData(newValue: Int) { dataAccessQueue.async { // Тағйироти бехатари маълумоти умумӣ sharedData = newValue } } -
Гурӯҳбандии вазифаҳо: Чекор кардани анҷоми чанд вазифаи асинхрон пеш аз идома додан.
// Гурӯҳи вазифаҳо let group = DispatchGroup() group.enter() // Оғози вазифаи 1 performAsyncOperation1 { print("Вазифа 1 анҷом ёфт") group.leave() } group.enter() // Оғози вазифаи 2 performAsyncOperation2 { print("Вазифа 2 анҷом ёфт") group.leave() } // Огоҳӣ пас аз анҷоми ҳамаи вазифаҳо group.notify(queue: .main) { print("Ҳама вазифаҳо анҷом ёфтанд, навсозии UI") // Навсозии UI } -
Иҷрои таъхиршуда: Иҷрои код пас аз мӯҳлати муайян.
// Иҷрои таъхиршуда пас аз 2 сония DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("Пуск шуд пас аз 2 сония") }
GCD ба сатҳи баландтар ва самараноктар дар идоракунии сатрҳо нисбат ба сатрҳои анъанавӣ (масалан, Thread) пешниҳод мекунад, ки идоракунии пулҳои сатрҳоро ба системаи дода, истифодаи самараноки бисёр ядроҳои процессорро имконпазир месозад.