Sobes.tech
Middle+

თუ AppDelegate-ში მთავარი ნაკადში გამოიძახებთ 'dispatchQueue.main.sync'-ს, რა მოხდება?

sobes.tech AI

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

მიმდინარე პროცესში ურთიერთდაბლოკვა (Deadlock) წარმოიქმნება.

განმარტება:

  1. AppDelegate მუშაობს მთავარი ნაკადში.
  2. dispatchQueue.main.sync ცდილობს კოდის შესრულებას მთავარი ნაკადში სინქრონულად, ანუ ელოდება ბლოკის დასრულებას.
  3. მაგრამ მთავარი ნაკადი უკვე დაკავებულია AppDelegate-ის შესრულებით და ელოდება sync-ის ბლოკის დასრულებას.
  4. sync-ის ბლოკი ვერ იწყება, რადგან მთავარი ნაკადი დაკავებულია ელოდებით.

მოკლედ, მთავარი ნაკადი ელოდება ბლოკის დასრულებას, ხოლო ბლოკი ელოდება მთავარი ნაკადის გათავისუფლებას — წარმოიქმნება Deadlock. პროგრამა გაყინდება.

კოდი მაგალითი, რომელიც გამოიწვევს Deadlock-ს:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print("აპლიკაცია დაიწყო")

    // ეს გამოძახება გამოიწვევს Deadlock-ს
    DispatchQueue.main.sync {
        print("ეს კოდი არასოდეს შესრულდება")
    }

    print("ეს კოდი ასევე არ მიაღწევს")

    return true
}