Sobes.tech
Middle+

Kas nutiks, jei AppDelegate pagrindiniame sraute iškviesti 'dispatchQueue.main.sync'?

sobes.tech AI

Atsakymas iš AI

Įvyksta Deadlock (tarpusavio blokavimas).

Paaiškinimas:

  1. AppDelegate veikia pagrindiniame sraute.
  2. dispatchQueue.main.sync bando vykdyti kodą pagrindiniame sraute sinchroniškai, t.y., laukia, kol užbaigsis kodo blokas.
  3. Bet pagrindinis srautas jau užimtas AppDelegate vykdymo ir laukia, kol sync blokas pasibaigs.
  4. sync blokas negali pradėti, nes pagrindinis srautas užimtas laukimu.

Trumpai tariant, pagrindinis srautas laukia bloko pabaigos, o blokas laukia pagrindinio srauto laisvės — įvyksta Deadlock. Programėlė užšals.

Kodo pavyzdys, kuris sukels Deadlock:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print("Programėlė paleista")

    // Šis iškvietimas sukels Deadlock
    DispatchQueue.main.sync {
        print("Šis kodas niekada nebus vykdomas")
    }

    print("Šis kodas taip pat nebus pasiektas")

    return true
}