Sobes.tech
Middle

iOS-ის განვითარების კონტექსტში 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-ით.")