Sobes.tech
Middle

რა ინსტრუმენტები ხელმისაწვდომია Grand Central Dispatch (GCD)-ში?

sobes.tech AI

პასუხი AI-სგან

GCD-ის ძირითადი ინსტრუმენტები:

  • დისპეჩერული რიგები (Dispatch Queues): მართავს კოდის ბლოკების შესრულებას. შეიძლება იყოს:
    • სერიული (Serial): ასრულებს დავალებებს ერთის შემდეგ, უზრუნველყოფს წესრიგს.
    • პარალელური (Concurrent): ასრულებს დავალებებს ერთდროულად (ხელმისაწვდომი სისტემური რესურსების ფარგლებში).
  • გლობალური პარალელური რიგები (Global Concurrent Queues): სისტემის მიერ მოწოდებული, აქვთ წინასწარ განსაზღვრული პრიორიტეტები (QoS).
  • მთავარი რიგი (Main Queue): სპეციალური სერიული რიგი, დაკავშირებულია აპლიკაციის მთავარ ნაკადთან. გამოიყენება UI-სთან მუშაობისთვის.
  • დისპეჩერული ჯგუფები (Dispatch Groups): საშუალებას აძლევს თვალთვალს ასინქრონული დავალებების დასრულებაზე.
  • ბარიერის სემანტიკა (Barrier Semantics): პარალელური რიგებისთვის, საშუალებას აძლევს შექმნას "ბარიერი", რომლის შემდეგაც შესრულდება მხოლოდ ბარიერის შემდეგ განთავსებული დავალებები, სანამ ბარიერი გადალახული არ იქნება.
  • დისპეჩერული წყაროები (Dispatch Sources): საშუალებას აძლევს რეაგირება მოახდინოს სისტემურ მოვლენებზე (ფაილური ოპერაციები, სიგნალები, ტაიმერები და ა.შ.).
  • DispatchWorkItem: კოდის ბლოკს ხვდება და შეიძლება იყოს გაგზავნილი რიგში, გაუქმებული და შეტყობინებული დასრულებაზე.

მაგალითი სერიული რიგის შექმნისა და დავალების შესრულების:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // ასინქრონულად შესრულდება სერიული რიგში
    print("დავალება შესრულდა სერიულ რიგში")
}

მაგალითი დისპეჩერული ჯგუფის გამოყენების:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // ჯგუფში შესვლა
concurrentQueue.async {
    // დავალება 1
    print("დავალება 1 დასრულდა")
    group.leave() // ჯგუფიდან გასვლა
}

group.enter() // ჯგუფში შესვლა
concurrentQueue.async {
    // დავალება 2
    print("დავალება 2 დასრულდა")
    group.leave() // ჯგუფიდან გასვლა
}

group.notify(queue: .main) {
    // შესრულდება ყველა დავალების დასრულების შემდეგ
    print("ყველა დავალება ჯგუფში დასრულდა")
}

მაგალითი DispatchWorkItem-ის გამოყენების:

let workItem = DispatchWorkItem {
    print("WorkItem შესრულდა")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // შეიძლება გაუქმდეს შესრულებამდე