Sobes.tech
Middle+

Co się stanie, jeśli w AppDelegate na głównym wątku wywołasz 'dispatchQueue.main.sync'?

sobes.tech AI

Odpowiedź od AI

Wystąpi Deadlock (wzajemne blokowanie).

Wyjaśnienie:

  1. AppDelegate działa na głównym wątku.
  2. dispatchQueue.main.sync próbuje wykonać kod na głównym wątku synchronizacyjnie, tzn. czeka na zakończenie bloku kodu.
  3. Ale główny wątek jest już zajęty wykonywaniem AppDelegate i oczekuje na zakończenie bloku w sync.
  4. Blok w sync nie może się rozpocząć, ponieważ główny wątek jest zajęty oczekiwaniem.

Podsumowując, główny wątek czeka na wykonanie bloku, a blok czeka na zwolnienie głównego wątku — dochodzi do wzajemnego blokowania. Aplikacja się zawiesi.

Przykład kodu, który spowoduje Deadlock:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print("Aplikacja uruchomiona")

    // To wywołanie spowoduje Deadlock
    DispatchQueue.main.sync {
        print("Ten kod nigdy nie zostanie wykonany")
    }

    print("Ten kod również nie zostanie osiągnięty")

    return true
}