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() // შეიძლება გაუქმდეს შესრულებამდე