В настоящее время у меня есть начальный вид входа в систему (A) и второй вид, когда (B) уже вошел в систему.
Я хочу, чтобы, когда я открываю приложение, и у пользователя есть значения сохраненный в UserDefaults.standard, убедитесь, что значения соответствуют значениям сервера, и если они верны, введите представление B.
Проблема в том, что alamofire является асинхронным, и представление A загружается до того, как вы получите ответ.
SceneDelegate.swift
Первая попытка, прежде чем мы узнали, что alamofire был запущен асинхронно
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
//Code to open default viewA
...
//Code to try open viewB
let logAcepted = openViewB(url, param)
if logAcepted //<-- this execute before query in func before
{
if let windowScene = scene as? UIWindowScene
{
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: Principal())
self.window = window
window.makeKeyAndVisible()
}
}
}
Я видел, что есть поле завершения, которое могло бы помочь решить эту проблему, но я думаю, что я не применил его хорошо.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
//Code to open default viewA
...
//Code to try open viewB
openViewB(url, param, completion: {logAcepted in
if logAcepted
{
if let windowScene = scene as? UIWindowScene
{
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: Principal())
self.window = window
window.makeKeyAndVisible()
}
}
})
}
Как я могу заставить эту функцию работать синхронно? или основной код ожидает результата запроса?
func openViewB(_ url: String, _ param: [String : String], completion : @escaping (Bool)->()) {
var ret : Bool = false
AF.request(url, parameters: param).responseJSON {response in
switch response.result {
case .success(let value):
if let JSON = value as? [String: Any]
{
let status = JSON["status"] as! String
switch status
{
case "Ok":
ret = true
completion(ret)
default:
ret = false
completion(ret)
}
}
case .failure( _):
ret = false
completion(ret)
}
}
}
Я нашел много связанной информации, но ни одна из них не работает в этой версии swift / alamofire