gpt4 book ai didi

ios - 如何快速等待 POST 调用的结果?

转载 作者:行者123 更新时间:2023-11-28 06:49:10 25 4
gpt4 key购买 nike

我正在使用适用于 ios 的 google api 登录移动应用程序(取自此处:https://developers.google.com/identity/sign-in/ios/backend-auth他们在那里展示了如何使用 objective-c 向后端服务器发出发布请求,结果是获取 token 是否有效的信息。

我正确地建立了我的后端服务器,它验证 token 是否正确(并返回状态 200401。现在我只需要发送从应用程序到我的服务器的 token ,并根据其结果验证用户与否。

我找到了这个关于发帖请求的答案:https://stackoverflow.com/a/26365148/4662074

在这个例子之后,我将其编码如下:

// [START signin_handler]
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
withError error: NSError!) {
if (error == nil) {
print("!!!! TOKEN !!!! "+user.authentication.idToken)

let request = NSMutableURLRequest(URL: NSURL(string: "http://mywebserver.com:3000/auth/token")!)
request.HTTPMethod = "POST"
let postString = "id_token="+user.authentication.idToken
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
guard error == nil && data != nil else { // check for fundamental networking error
print("error=\(error)")
return
}

if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}

let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")


print("Signed in as a user: "+user.profile.name)

}
task.resume()

let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}

} else {
print("\(error.localizedDescription)")

}
}
// [END signin_handler]

好的,在这种情况下,在调用网络服务后,我立即将 View 切换到应用程序的主页:

let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}

但由于我是在 task.resume() 之后立即执行此操作的 - 这意味着我永远不会等待来自网络服务的结果,即使它声明 401 - 用户仍然签名。我试图将那段代码放在 task.resume() 之上,但随后出现错误:

This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes.  This will cause an exception in a future release.

那么我如何在登录过程中包含来 self 的网络服务的答案,如果状态为 200 - 然后将 View 切换到我的 TabController? (在其他情况下,例如要求用户重新登录)

最佳答案

告诉,不要等待。

请求异步工作,因此在成功时在完成 block 中实例化您的 Controller 。要避免 auto layout engine 消息,您必须在主线程上执行此操作。

       ...
print("Signed in as a user: "+user.profile.name)

dispatch_async(dispatch_get_main_queue()) {
let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}
}
}
task.resume()
} else { ... }

关于ios - 如何快速等待 POST 调用的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com