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): Белгиленген блокту iterations жолу параллелдүү аткарууга мүмкүндүк берет.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Ар бир индекс үчүн параллелдүү аткарылуучу код
    }
    
  6. DispatchWorkItem: Коду блоктогон жана тапшырманы анын башталгандан мурун же башталганга чейин жокко чыгара турган мүмкүнчүлүк берет.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Тапшырманын коду
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Эгер ал башталбаган болсо, жокко чыгара аласыз
    // workItem?.cancel()