Sobes.tech
Middle

ԻՕՍ զարգացման համատեքստում dispatch խմբի ի՞նչ է։

sobes.tech AI

Պատասխան AI-ից

DispatchGroup — դա GCD (Grand Central Dispatch) մեխանիզմ է, որը թույլ է տալիս հետևել ասինխրոնային առաջադրանքների խմբի ավարտին և կատարել գործողություն նրանց ավարտից հետո: Օգտակար է, երբ անհրաժեշտ է համաժամեցնել մի քանի կառավարիչ հերթերի կամ հոսքերի աշխատանքը:

Հիմնական մեթոդներ՝

  • enter(): տեղեկացնում է խմբին, որ առաջադրանքը սկսվել է: ավելացնում է խմբի ներքին հաշվիչը:
  • leave(): տեղեկացնում է խմբին, որ առաջադրանքը ավարտվել է: նվազեցնում է հաշվիչը:
  • wait(): բլոկավորում է ընթացիկ հոսքը մինչև խմբի հաշվիչը դառնա զրո կամ ժամանակային սահմանափակումը լրանա:
  • notify(queue:execute:): գրանցում է կոդի բլոկ, որը կիրականացվի ասինխրոն՝ նշված հերթում, երբ խմբի հաշվիչը դառնա զրո:

Օրինակ notify-ի օգտագործման:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

queue.async(group: group) {
    // Առաջին ասինխրոն առաջադրանքը
    print("Առաջադրանք 1 կատարվում է...")
    Thread.sleep(forTimeInterval: 1)
    print("Առաջադրանք 1 ավարտված է.")
}

queue.async(group: group) {
    // Երկրորդ ասինխրոն առաջադրանքը
    print("Առաջադրանք 2 կատարվում է...")
    Thread.sleep(forTimeInterval: 2)
    print("Առաջադրանք 2 ավարտված է.")
}

// Կատարել այս բլոկը բոլոր առաջադրանքների ավարտից հետո
group.notify(queue: .main) {
    print("Բոլոր առաջադրանքները խմբում ավարտվեցին.")
}

// Դեմոնստրացիայի համար՝ notify-ի ոչ բլոկավոր բնույթ
print("Կոդը ավելացնելուց հետո")

Այլընտրանքային օրինակ՝ ձեռքով enter() և leave()-ով:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

group.enter() // Առաջադրանքը 1 սկսվեց
queue.async {
    print("Առաջադրանք 1 կատարվում է...")
    Thread.sleep(forTimeInterval: 1)
    print("Առաջադրանք 1 ավարտվեց.")
    group.leave() // Առաջադրանքը 1 ավարտվեց
}

group.enter() // Առաջադրանքը 2 սկսվեց
queue.async {
    print("Առաջադրանք 2 կատարվում է...")
    Thread.sleep(forTimeInterval: 2)
    print("Առաջադրանք 2 ավարտվեց.")
    group.leave() // Առաջադրանքը 2 ավարտվեց
}

group.notify(queue: .main) {
    print("Բոլոր առաջադրանքները խմբում ավարտվեցին notify-ով.")
}

// Օրինակ՝ `wait`-ի օգտագործում (բլոկավոր)
// group.wait()
// print("Բոլոր առաջադրանքները ավարտվեցին wait-ով.")