【发布时间】:2018-06-04 10:26:33
【问题描述】:
我希望我的应用程序返回到原始 API 调用。这是一个示例代码:
func getDataFromServer()
{
guard let apiUrl = URL(string: endPoint) else {
return
}
getAccessTokenValue( completionHandler:{ accesstoken in
//if access token is valid continue to get data
//.......
let task = self.apiSession.dataTask(with: apiRequest, completionHandler: {
(data, response, error) in
//Manage response/data/error
})
task.resume()
})
}
func getAccessTokenValue(completionHandlerResult : @escaping (_ accesstoken : String) -> ())
{
var hasAccessTokenExpired = true
// do some calculation
//check if access token has expired
if hasAccessTokenExpired
{
self.renewAccessToken(completionHandler: { accessTokenValue in
completionHandlerResult(accessTokenValue)})
}
else{
completionHandlerResult( accessToken) //return the current access token
}
}
func static func renewAccessToken (completionHandler : @escaping (_ accessTokenValue:String) -> ()) //
{
//another API call to refresh Access Token
//.......
let task = self.apiSession.dataTask(with: apiRequest, completionHandler: {
(data, response, error) in
//Manage response/data/error
//read access token from response
completionHandler(accessToken)
})
task.resume()
}
我面临的问题是当我的访问令牌不再有效时,刷新令牌的 API 被触发,但是当 renewAccessToken 中的数据任务完成时,我的应用程序已经执行了 getAccessTokenValue 和 getDataFromServer 的结尾。因此,在获取刷新的访问令牌后(在 getDataFromServer 的 getAccessTokenValue 完成处理程序中)应该执行的 API 不再被触发。
我无法弄清楚我哪里出错了。
【问题讨论】:
-
我不明白这个问题,从上面的代码中调用“getDataFromServer”它首先获取访问令牌然后执行api请求。
-
放置一个断点并确保在
renewAccessToken中调用完成处理程序。 -
@TodorBrachkov 调用了 renewAccessToken 的完成处理程序,但它不返回 getAccessTokenValue。问题是当在 renewAccessToken 中调用 task.resume() 时,它会到达 getAccessTokenValue 的末尾,然后到 getDataFromServer 的末尾,然后返回到我调用 getDataFromServer 的位置。控件返回 renewAccessToken 中的 dataTask,但完成后它不会返回 getAccessTokenValue。
-
@TodorBrachkov - 解决了这个问题。当 API 失败时没有调用完成处理程序是一个问题。我添加了它,现在它完美运行。谢谢你:)
-
很高兴您解决了它,抱歉回复晚了。
标签: ios closures swift4 nsurlsessiondatatask urlsession