Sobes.tech
Middle+

Агар дар AppDelegate дар нахустин ҷараён 'dispatchQueue.main.sync' даъват карда шавад, чӣ мешавад?

sobes.tech AI

Ҷавоб аз AI

Маъзурият (взаимная блокировка) пайда бўлади.

Тушунтириш:

  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
}