【发布时间】:2020-07-26 12:41:42
【问题描述】:
目前的情况是我有一个登录视图(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
【问题讨论】:
标签: ios asynchronous alamofire swift5 alamofire-request