我希望能够使用一个Bool方法检查用户是否已登录,如果是,则返回要在API标头中使用的标记。
func isLoggedIn() -> Bool {
if let authToken = AuthManager.loadAuthToken() {
if authToken.expiration.isGreaterThanDate(Date()) {
return true
} else {
let authAPI = AuthenticationAPI()
authAPI.refreshToken(token: authToken.token) { (results) in
switch results {
case .success(let response):
[HAVE PARENT METHOD RETURN TRUE]
case .failure:
removeAuthToken()
[HAVE PARENT METHOD RETURN FALSE]
}
}
}
}
return false
}
我有这个大部分都在工作,但是,当我遇到令牌时,我正试图弄清楚如何允许应用程序尝试刷新令牌调用,但它已过期。
信号量似乎是要走的路,但似乎很快使代码复杂化。这是应该做的方式还是通常为此做的更好的方法?
答案 0 :(得分:2)
我采取了不同的方法。
在AuthManager
类的类中,我将令牌存储在可选的var中。如果令牌存在,那么我认为它在API调用中使用是有效的。在令牌的didSet
中,会发送一个Notification.Name.authStatusDidChange
通知,以便应用可以做出相应的响应。
如果API调用返回401
,那么我通知AuthManager
清除令牌(触发通知,在我的情况下显示登录流程)。
但是,您可以使用其他逻辑而不是清除令牌,Authmanager
首先尝试刷新它。如果刷新成功,则会发送不同的通知以重试API请求。否则,它会清除令牌并触发登录。
在我打字的时候 - 就像Michal说的那样,还有更多细节。