目前的情况是我有一个初始视图登录 (A) 和第二个视图 (B) 已经登录。
我希望当我打开应用程序并且用户将值存储在 UserDefaults.standard 中时,检查这些值是否与服务器的值匹配,如果它们正确,请进入 B 视图。
问题是alamofire是异步的,A-view在你得到答案之前就被加载了。
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