Sobes.tech
Middle

რა მეთოდები არსებობს სამუშაოების განთავსებისთვის Grand Central Dispatch (GCD)-ის რიგში?

sobes.tech AI

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

GCD հերթում խնդիրներ տեղադրելու հետևյալ եղանակները կան:

  1. Անսինխրոն կատարում (async): Թողարկում է խնդիրն ու անմիջապես շարունակվում է ընթացիկ հոսքում՝ սպասելու փոխարեն, որ խնդիրն ավարտվի։

    DispatchQueue.global().async {
        // Կոդ խնդիր
    }
    
  2. Սինխրոն կատարում (sync): Թողարկում է խնդիրն ու ներկայիս հոսքը մնում է սպասելու՝ մինչև խնդիրն ավարտվի։ Խուսափեք օգտագործել sync գլխավոր հոսքում երկարատև խնդիրների համար, որպեսզի չխոչընդոտեք UI-ին։

    DispatchQueue.global().sync {
        // Կոդ խնդիր, ներկայիս հոսքը կսպասի
    }
    
  3. Հետաձգված կատարում (asyncAfter): Թողարկում է խնդիրն նշված հետաձգմամբ։ Կատարման սկիզբը չի լինի շուտ, քան նշված ժամանակը։

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Կոդ խնդիր 2 վայրկյան անց կիրականացվի
    }
    
  4. Խմբում կատարման (DispatchGroup): Թողարկումները կարող են ավելացվել DispatchGroup-ին՝ նրանց ավարտը սինխրոնիզացնելու համար։ Կարող եք սպասել բոլորի ավարտին կամ ստանալ ծանուցում (notify) նրանց ավարտից հետո։

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Առաջին խնդիր
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Երկրորդ խնդիր
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Բոլոր խնդիրները ավարտվել են
    }
    
  5. Կատարման կրկնություն (concurrentPerform): Թույլ է տալիս մի քանի անգամ միևնույն կոդի բլոկը կատարել՝ միաժամանակ՝ մրցակցային հերթում։

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Կոդ, որը կատարվում է յուրաքանչյուր ինդեքսի համար՝ միաժամանակ
    }
    
  6. DispatchWorkItem: Կապում է կոդի բլոկը և թույլ է տալիս չեղարկել առաջադրանքը՝ նախքան այն սկսելը կամ հետո՝ եթե այն դեռ չի սկսվել։

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Կոդ առաջադրանքի
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Կարող եք չեղարկել առաջադրանքը, եթե այն դեռ չի սկսվել
    // workItem?.cancel()