Sobes.tech
Middle

Grand Central Dispatch (GCD) navbatiga vazifalarni joylashtirish uchun qanday usullar mavjud?

sobes.tech AI

AIdan javob

GCD navbatiga vazifalarni joylashtirishning quyidagi usullari mavjud:

  1. Asinxron bajarish (async): Vazifa navbatga qo'shiladi va bajarish darhol joriy oqimda davom etadi, navbatdagi vazifa tugashini kutmay.

    DispatchQueue.global().async {
        // Vazifa kodi
    }
    
  2. Sinkron bajarish (sync): Vazifa navbatga qo'shiladi va joriy oqim bloklanadi, vazifa tugaguniga qadar. Uzoq davom etadigan vazifalar uchun sync ni asosiy oqimda ishlatmang, UI ni bloklamaslik uchun.

    DispatchQueue.global().sync {
        // Vazifa kodi, joriy oqim kutadi
    }
    
  3. Keçirilgan bajarish (asyncAfter): Vazifa belgilangan kechikish bilan navbatga qo'shiladi. Bajarish belgilangan vaqtdan kechiktirilmay boshlanadi.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Vazifa kodi 2 soniya ichida bajariladi
    }
    
  4. Guruhda bajarish (DispatchGroup): Vazifalar DispatchGroup ga qo'shilishi mumkin, ularning yakunlanishini sinxronlashtirish uchun. Barcha tugashini kutish yoki tugagach xabar olish mumkin (notify).

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Vazifa 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Vazifa 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Barcha vazifalar tugadi
    }
    
  5. Iteratsiyalarni bajarish (concurrentPerform): Kod blokini iterations marta parallel ravishda bajarishga imkon beradi.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Har bir indeks uchun parallel bajariladigan kod
    }
    
  6. DispatchWorkItem: Kod blokini o'z ichiga oladi va vazifani boshlashdan oldin yoki qo'shilgandan keyin, agar hali boshlanmagan bo'lsa, bekor qilish imkonini beradi.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Vazifa kodi
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Vazifa hali boshlanmagan bo'lsa, bekor qilish mumkin
    // workItem?.cancel()