Итак, вот что я пытаюсь достичь:
У меня есть экран входа в приложение. Если пользователь вошел в систему, он должен немедленно перейти к другому представлению. Если это не так, он должен сделать запрос на вход в систему и при успешном входе - перейти к другому представлению.
Проблема в том, что я выполняю вход в систему с помощью slack, поэтому процесс таков: я открываю браузер с
UIApplication.shared.open(url, options: [:], completionHandler: nil)
пользователь входит в систему, а затем я открываю приложение через глубокую ссылку. Когда я открываю приложение по глубокой ссылке, я сохраняю токен авторизации, который необходим для дальнейшего взаимодействия с внутренним сервером. Из-за этого мне приходится ждать выполнения перехода к другому контроллеру, пока вход в систему не будет успешным (другому контроллеру требуются данные с внутреннего сервера).
То, что я сейчас пробовал, - это использовать для этого семафор.
Итак, у меня есть этот код в функции просмотра viewDidLoad в журнале:
DispatchQueue.main.async {
semaphore.wait()
UIApplication.shared.open(url, options: [:], completionHandler: nil)
(...)
Provider.semaphore.wait()
self.performSegue(withIdentifier: "segueShowTabBar", sender: self)
Provider.semaphore.signal()
}
и это в AppDelegate:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
self.setAuthDataFromURL(url: url)
Provider.semaphore.signal()
return true
}
Провайдер - это синглтон, который мы используем для связи API, так что это определенно тот же семафор.
Но код делегата приложения даже не запускается, потому что когда приложение открывается из глубокой ссылки, его основной поток все еще застревает во втором Provider.semaphore.wait () в представлении входа в систему.
Я поступаю по этому поводу совершенно неправильно? Есть ли способ подождать с выполнением этого перехода и все еще иметь возможность запускать код из AppDelegate?